This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-website.git


The following commit(s) were added to refs/heads/master by this push:
     new 87da96662ba [course] Make the hackathon task pages permanent (#4386)
87da96662ba is described below

commit 87da96662ba3cbe54e8e980a2b332817bcba2dcf
Author: Mingyu Chen (Rayner) <[email protected]>
AuthorDate: Mon Oct 19 17:02:46 2026 +0100

    [course] Make the hackathon task pages permanent (#4386)
    
    ## What this changes
    
    The Apache Doris Hackathon pages were built for Community over Code 2026
    Glasgow. That event is over, so the pages become a permanent, self-paced
    set of tasks and no longer reference a date, venue or on-site organiser.
    
    - Copy is event-independent: "start anytime", "no deadline",
    "self-paced"; the top bar shows an open-task note instead of the
    conference date/room link.
    - Help is unified to `#dev` on the Apache Doris Slack; the on-site "ask
    Mingyu at the Doris table" wording is gone.
    - Submit and badge flow is unchanged: same starter kit, same
    `morningman/demo-env` submission PR, same Contributor badge for taking
    part. The "show it on site" step becomes "share it in `#dev`".
    - Pages move from `/course/hackathon/glasgow-2026/*` to
    `/course/hackathon/*`; the old URLs get client redirects (including the
    `zh-CN` prefix).
    - The starter-kit ZIP and submission folder keep their original
    `doris-hackathon-glasgow-2026` names so existing downloads and
    participant PRs stay valid.
    - Removed the now-unused event ticket/LED styles and dead selectors.
    
    ## Validation
    
    - `node --test` for `SlackCommunityNudge.logic.test.js` and
    `hackathon.logic.test.js`: 17/17 pass.
    - All changed TS/TSX files parse; both changed SCSS files compile with
    sass.
    - `docusaurus.config.js` passes `node --check`.
    - Reviewed locally with `LANDING_ONLY=true yarn start`; all five new
    routes return 200.
    - Redirects are build-only (`plugin-client-redirects` is inactive in
    dev), so they are not exercised by the dev server.
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    Co-authored-by: morningman <[email protected]>
    Co-authored-by: Claude Code <[email protected]>
---
 docusaurus.config.js                               | 10 ++++
 src/components/course/CourseLanding.tsx            |  2 +-
 .../course/hackathon/HackathonCourseTrack.scss     | 69 +---------------------
 .../course/hackathon/HackathonCourseTrack.tsx      | 38 ++++--------
 .../course/hackathon/HackathonTaskPage.scss        | 36 +----------
 .../course/hackathon/HackathonTaskPage.tsx         | 49 ++++++---------
 .../course/hackathon/HackathonTrackBPage.tsx       |  8 +--
 .../course/hackathon/hackathonCommon.tsx           |  4 +-
 src/components/course/hackathon/hackathonEvent.ts  | 29 ++++-----
 src/components/course/hackathon/tasks/a2Mcp.tsx    |  2 +-
 src/components/course/hackathon/tasks/trackB.tsx   |  2 +-
 .../home-next/SlackCommunityNudge.logic.test.js    |  2 +-
 .../{glasgow-2026 => }/a1-hybrid-search.tsx        |  0
 .../course/hackathon/{glasgow-2026 => }/a2-mcp.tsx |  0
 .../hackathon/{glasgow-2026 => }/a3-log-search.tsx |  0
 .../{glasgow-2026 => }/a4-agent-traces.tsx         |  0
 .../hackathon/{glasgow-2026 => }/track-b.tsx       |  0
 17 files changed, 66 insertions(+), 185 deletions(-)

diff --git a/docusaurus.config.js b/docusaurus.config.js
index b10d238fc69..8316730d3fe 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -89,6 +89,16 @@ function buildRedirectIndex() {
     add('/course', '/learning');
     add('/zh-CN/course', '/zh-CN/learning');
 
+    // The hackathon task pages used to live under an event-specific
+    // /course/hackathon/glasgow-2026 prefix. They are permanent now, so the
+    // old URLs (posters, QR codes, bookmarks) redirect to the new ones.
+    for (const locale of ENABLED_LOCALES) {
+        const prefix = locale === 'en' ? '' : `/${locale}`;
+        for (const page of ['a1-hybrid-search', 'a2-mcp', 'a3-log-search', 
'a4-agent-traces', 'track-b']) {
+            add(`${prefix}/course/hackathon/${page}`, 
`${prefix}/course/hackathon/glasgow-2026/${page}`);
+        }
+    }
+
     // /vendors lost its navigation entry in the new-homepage refactor and has
     // no obvious successor page, so it lands on the homepage. Its source is
     // parked at src/pages/_vendors (underscore = not routed).
diff --git a/src/components/course/CourseLanding.tsx 
b/src/components/course/CourseLanding.tsx
index 0bb5542c127..f4d3fde19b5 100644
--- a/src/components/course/CourseLanding.tsx
+++ b/src/components/course/CourseLanding.tsx
@@ -55,7 +55,7 @@ function CoursePath(): JSX.Element {
         >
             <div className="course-landing__path-header">
                 <h2 id="course-path-title">Your Doris path</h2>
-                <span>6 available · more to come</span>
+                <span>{hackathonOn ? 'Self-paced · open to everyone' : '6 
available · more to come'}</span>
             </div>
             {HACKATHON_COURSE_TRACK_ENABLED ? (
                 <>
diff --git a/src/components/course/hackathon/HackathonCourseTrack.scss 
b/src/components/course/hackathon/HackathonCourseTrack.scss
index e49f2be6a57..4487951c5ec 100644
--- a/src/components/course/hackathon/HackathonCourseTrack.scss
+++ b/src/components/course/hackathon/HackathonCourseTrack.scss
@@ -1,4 +1,4 @@
-// Temporary hackathon track inside the /course "Your Doris path" card: a
+// Permanent hackathon track inside the /course "Your Doris path" card: a
 // two-position switch (Doris 101 | Hackathon) and the hackathon panel. Remove
 // the switch, the panel and this file and the card is exactly today's card.
 
@@ -66,16 +66,6 @@
         }
     }
 
-    // "Live" LED on the hackathon side.
-    .hk-switch__led {
-        width: 9px;
-        height: 9px;
-        flex: none;
-        border-radius: 50%;
-        background: var(--brand-primary);
-        box-shadow: 0 0 0 3px var(--brand-primary-soft);
-    }
-
     .hk-nw {
         white-space: nowrap;
     }
@@ -106,49 +96,6 @@
         text-wrap: balance;
     }
 
-    a.hk-ticket {
-        display: grid;
-        grid-template-columns: auto auto minmax(0, 1fr);
-        margin-top: 14px;
-        border: 2px solid var(--brand-ink);
-        border-radius: 12px;
-        background: var(--brand-paper);
-        box-shadow: 0 3px 0 var(--brand-ink);
-        color: var(--brand-ink);
-        text-decoration: none;
-        transition:
-            transform 0.12s,
-            box-shadow 0.12s;
-
-        &:hover {
-            color: var(--brand-ink);
-            text-decoration: none;
-            transform: translateY(-1px);
-        }
-
-        &:active {
-            box-shadow: 0 0 0 var(--brand-ink);
-            transform: translateY(3px);
-        }
-
-        span {
-            padding: 10px 12px;
-            font: 800 12px/1.2 var(--font-mono);
-            letter-spacing: 0.06em;
-            text-transform: uppercase;
-            white-space: nowrap;
-
-            + span {
-                border-left: 2px dashed var(--brand-border-soft);
-            }
-        }
-
-        i {
-            color: var(--brand-primary-deep);
-            font-style: normal;
-        }
-    }
-
     .hk-track__sub {
         margin: 10px 0 0;
         color: var(--brand-ink-soft);
@@ -346,19 +293,6 @@
             font-size: 19px;
         }
 
-        a.hk-ticket {
-            grid-template-columns: auto minmax(0, 1fr);
-
-            span:first-child {
-                grid-column: 1 / -1;
-                border-bottom: 2px dashed var(--brand-border-soft);
-            }
-
-            span:nth-child(2) {
-                border-left: 0;
-            }
-        }
-
         a.hk-pad {
             min-height: 100px;
             padding: 10px;
@@ -369,7 +303,6 @@
 @media (prefers-reduced-motion: reduce) {
     .course-landing {
         .hk-switch__tab,
-        a.hk-ticket,
         a.hk-pad,
         .hk-pad__code {
             transition: none;
diff --git a/src/components/course/hackathon/HackathonCourseTrack.tsx 
b/src/components/course/hackathon/HackathonCourseTrack.tsx
index 744443ff673..781cf6a202d 100644
--- a/src/components/course/hackathon/HackathonCourseTrack.tsx
+++ b/src/components/course/hackathon/HackathonCourseTrack.tsx
@@ -11,8 +11,8 @@ import {
 } from './hackathonEvent';
 import './HackathonCourseTrack.scss';
 
-// The temporary "Hackathon" track inside the /course "Your Doris path" card.
-// `#hackathon` on the URL selects it, so posters and messages can link to it.
+// The permanent "Hackathon" track inside the /course "Your Doris path" card.
+// `#hackathon` on the URL selects it, so messages can link straight to it.
 
 export type CourseTrack = 'course' | 'hackathon';
 
@@ -101,12 +101,9 @@ export function CourseTrackSwitch({ track, onSelect }: 
CourseTrackSwitchProps):
                 <small>Free course</small>
             </button>
             <button {...tabProps('hackathon', 1)}>
-                <strong>
-                    Hackathon
-                    <i className="hk-switch__led" aria-hidden="true" />
-                </strong>
+                <strong>Hackathon</strong>
                 <small>
-                    {HACKATHON_EVENT.city} · <span 
className="hk-nw">{HACKATHON_EVENT.dateShort}</span>
+                    Open tasks · <span className="hk-nw">start anytime</span>
                 </small>
             </button>
         </div>
@@ -125,24 +122,12 @@ export function HackathonTrackPanel({ hidden }: { hidden: 
boolean }): JSX.Elemen
             hidden={hidden}
         >
             <div className="hk-track__event">
-                <p className="hk-track__kicker">
-                    {HACKATHON_EVENT.conference} · {HACKATHON_EVENT.city} · 
Hackathon
+                <p className="hk-track__kicker">Apache Doris Hackathon</p>
+                <h3 className="hk-track__headline">Build something real on 
Apache Doris — at your own pace.</h3>
+                <p className="hk-track__sub">
+                    Start any time and work at your own pace: one sitting or a 
few evenings. No Doris experience
+                    needed.
                 </p>
-                <h3 className="hk-track__headline">Build something real on 
Apache Doris — in one afternoon.</h3>
-                <a
-                    className="hk-ticket"
-                    href={HACKATHON_EVENT.eventUrl}
-                    target="_blank"
-                    rel="noopener noreferrer"
-                    aria-label={`${HACKATHON_EVENT.dateLong} · 
${HACKATHON_EVENT.time} · ${HACKATHON_EVENT.room} (event page, opens in a new 
tab)`}
-                >
-                    <span>{HACKATHON_EVENT.dateLong}</span>
-                    <span>{HACKATHON_EVENT.time}</span>
-                    <span>
-                        {HACKATHON_EVENT.room} <i aria-hidden="true">↗</i>
-                    </span>
-                </a>
-                <p className="hk-track__sub">Drop in any time. No Doris 
experience needed.</p>
             </div>
             <div className="hk-track__head">
                 <h4>Track A · Build on Doris</h4>
@@ -172,7 +157,10 @@ export function HackathonTrackPanel({ hidden }: { hidden: 
boolean }): JSX.Elemen
             </Link>
             <div className="hk-track__badge">
                 <img src={badgeUrl} alt="Apache Doris Contributor badge" 
width="52" height="52" />
-                <p>Take part in a task, show us at the Doris table, collect 
your Contributor badge.</p>
+                <p>
+                    Take part in a task, share it in 
<code>{HACKATHON_EVENT.slackChannel}</code> on Slack, collect your
+                    Contributor badge.
+                </p>
             </div>
         </section>
     );
diff --git a/src/components/course/hackathon/HackathonTaskPage.scss 
b/src/components/course/hackathon/HackathonTaskPage.scss
index 242797882b2..2d856cdff4f 100644
--- a/src/components/course/hackathon/HackathonTaskPage.scss
+++ b/src/components/course/hackathon/HackathonTaskPage.scss
@@ -215,7 +215,7 @@
 }
 
 // ---------------------------------------------------------------------------
-// Event bar (sticky under the site navbar)
+// Top bar (sticky under the site navbar)
 // ---------------------------------------------------------------------------
 
 .hk-task__bar {
@@ -274,7 +274,7 @@
     white-space: nowrap;
 }
 
-.hk-task a.hk-task__event {
+.hk-task .hk-task__event {
     display: flex;
     min-width: 0;
     align-items: center;
@@ -282,29 +282,12 @@
     color: var(--brand-ink-soft);
     font-size: 14px;
     line-height: 1.3;
-    text-decoration: none;
 
     > span {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
     }
-
-    &:hover {
-        color: var(--brand-ink);
-        text-decoration: none;
-
-        > span {
-            text-decoration: underline;
-            text-underline-offset: 3px;
-        }
-    }
-
-    svg {
-        width: 13px;
-        height: 13px;
-        color: var(--brand-primary-deep);
-    }
 }
 
 // ---------------------------------------------------------------------------
@@ -2164,10 +2147,6 @@
         --hk-wrap: min(720px, calc(100% - 48px));
     }
 
-    .hk-task__event-long {
-        display: none;
-    }
-
     .hk-task__grid {
         grid-template-columns: minmax(0, 1fr);
     }
@@ -2264,7 +2243,7 @@
         padding: 10px 0 12px;
     }
 
-    .hk-task a.hk-task__event {
+    .hk-task .hk-task__event {
         flex: 1 1 100%;
         align-items: flex-start;
         gap: 6px;
@@ -2272,14 +2251,6 @@
         > span {
             white-space: normal;
         }
-
-        svg {
-            margin-top: 3px;
-        }
-    }
-
-    .hk-task__event-long {
-        display: inline;
     }
 }
 
@@ -2310,7 +2281,6 @@
     // Phone tap targets: 44px minimum.
     .hk-task__btn--sm,
     .hk-task a.hk-task__back,
-    .hk-task a.hk-task__event,
     .hk-task .hk-task__refs a,
     .hk-task__copy {
         min-height: 44px;
diff --git a/src/components/course/hackathon/HackathonTaskPage.tsx 
b/src/components/course/hackathon/HackathonTaskPage.tsx
index 3c06f7974b4..82487f10e44 100644
--- a/src/components/course/hackathon/HackathonTaskPage.tsx
+++ b/src/components/course/hackathon/HackathonTaskPage.tsx
@@ -484,8 +484,8 @@ export function PanelNote({ children }: { children: 
ReactNode }): JSX.Element {
     );
 }
 
-/** Sticky bar above every hackathon page: back to /course and the event 
details. */
-export function HackathonEventBar(): JSX.Element {
+/** Sticky bar above every hackathon page: back to /course and the open-task 
note. */
+export function HackathonTopBar(): JSX.Element {
     return (
         <div className="hk-task__bar">
             <div className="hk-task__wrap hk-task__bar-in">
@@ -494,15 +494,9 @@ export function HackathonEventBar(): JSX.Element {
                     <span>Course</span>
                 </Link>
                 <span className="hk-task__tag">{HACKATHON_EVENT.name}</span>
-                <a className="hk-task__event" href={HACKATHON_EVENT.eventUrl} 
target="_blank" rel="noopener noreferrer">
-                    <span>
-                        <span className="hk-task__event-long">
-                            {HACKATHON_EVENT.conference} 
{HACKATHON_EVENT.city} ·{' '}
-                        </span>
-                        {HACKATHON_EVENT.dateShort} · {HACKATHON_EVENT.time} · 
{HACKATHON_EVENT.room}
-                    </span>
-                    <IconExternal />
-                </a>
+                <span className="hk-task__event">
+                    <span>Self-paced tasks · start anytime · no sign-up</span>
+                </span>
             </div>
         </div>
     );
@@ -539,8 +533,9 @@ export function HackathonTaskSwitch({ current }: { current: 
string }): JSX.Eleme
 export function HackathonHelpLine(): JSX.Element {
     return (
         <p className="hk-task__help">
-            <b>Stuck for more than 10 minutes?</b> Come to the Doris table and 
ask Mingyu, or post in{' '}
-            <code>{HACKATHON_EVENT.slackChannel}</code> on the <a 
href={HACKATHON_SLACK_URL}>Apache Doris Slack</a>.
+            <b>Stuck?</b> Ask in <code>{HACKATHON_EVENT.slackChannel}</code> 
on the{' '}
+            <a href={HACKATHON_SLACK_URL}>Apache Doris Slack</a>. Maintainers 
and other participants are there to
+            help.
         </p>
     );
 }
@@ -559,7 +554,7 @@ export const TRACK_A_SUBMIT_STEPS: ReactNode[] = [
 ];
 
 /**
- * How to submit and the badge. `steps` says what each track submits; showing
+ * How to submit and the badge. `steps` says what each track submits; sharing
  * the work, Slack and the badge rules are the same for both tracks.
  */
 export function HackathonSubmit({
@@ -586,25 +581,17 @@ export function HackathonSubmit({
                     ))}
                     <li>
                         <p>
-                            <strong>Show it</strong> at the Doris table (a 
2-minute demo is plenty), or at the
-                            show-and-tell around 14:30.
-                        </p>
-                    </li>
-                    <li>
-                        <p>
-                            <strong>
-                                Join the <a href={HACKATHON_SLACK_URL}>Apache 
Doris Slack</a>
-                            </strong>{' '}
-                            and say hi in 
<code>{HACKATHON_EVENT.slackChannel}</code>: questions, submissions and badges
-                            are all handled there.
+                            <strong>Share it</strong> in 
<code>{HACKATHON_EVENT.slackChannel}</code> on the{' '}
+                            <a href={HACKATHON_SLACK_URL}>Apache Doris 
Slack</a>: a link to your pull request or
+                            repository, plus a screenshot or a short demo. 
Questions, submissions and badges are all
+                            handled there.
                         </p>
                     </li>
                 </ol>
                 <p className="hk-task__late">
-                    Everyone who takes part in a task on site gets the 
<strong>Apache Doris Contributor badge</strong>:
-                    no merged pull request to Doris needed. Didn&apos;t finish 
by 15:00? Keep going — submissions are
-                    open until {HACKATHON_EVENT.deadline ?? <HackathonTba 
name="DEADLINE" />}. Teams are fine, but not
-                    needed: list every member&apos;s GitHub ID in {membersIn}.
+                    Everyone who takes part in a task gets the <strong>Apache 
Doris Contributor badge</strong>: no
+                    merged pull request to Doris needed. There is no deadline, 
so take as long as you need. Teams are
+                    fine, but not needed: list every member&apos;s GitHub ID 
in {membersIn}.
                 </p>
                 <div className="hk-task__submit-badge">
                     <Link to="/community/how-to-contribute/community-badges">
@@ -649,10 +636,10 @@ export function HackathonTaskPage({ content }: { content: 
HackathonTaskContent }
     return (
         <LayoutNext
             title={`${task.title} · Doris Hackathon`}
-            description={`${content.hook} A Track A task for the 
${HACKATHON_EVENT.name} at ${HACKATHON_EVENT.conference} 
${HACKATHON_EVENT.city}.`}
+            description={`${content.hook} A Track A task in the 
${HACKATHON_EVENT.name}: self-paced, with a starter kit and a runnable local 
Doris.`}
         >
             <div className="hk-task">
-                <HackathonEventBar />
+                <HackathonTopBar />
                 <HackathonTaskSwitch current={task.code} />
 
                 <div className="hk-task__wrap hk-task__grid">
diff --git a/src/components/course/hackathon/HackathonTrackBPage.tsx 
b/src/components/course/hackathon/HackathonTrackBPage.tsx
index 0983c574142..ca14cccbd0f 100644
--- a/src/components/course/hackathon/HackathonTrackBPage.tsx
+++ b/src/components/course/hackathon/HackathonTrackBPage.tsx
@@ -14,13 +14,13 @@ import {
     ConnectionCard,
     HackathonAllTasks,
     HackathonChecklistItem,
-    HackathonEventBar,
     HackathonHelpLine,
     HackathonRow,
     HackathonStarterKit,
     HackathonSubmit,
     HackathonTaskSwitch,
     HackathonTermList,
+    HackathonTopBar,
     PanelNote,
     RowsTable,
     START_SNIPPET,
@@ -205,10 +205,10 @@ export function HackathonTrackBPage(): JSX.Element {
     return (
         <LayoutNext
             title={`Track B · ${HACKATHON_TRACK_B.title} · Doris Hackathon`}
-            description={`${HACKATHON_TRACK_B.pitch} Track B of the 
${HACKATHON_EVENT.name} at ${HACKATHON_EVENT.conference} 
${HACKATHON_EVENT.city}.`}
+            description={`${HACKATHON_TRACK_B.pitch} Track B of the 
${HACKATHON_EVENT.name}: self-paced, open to everyone.`}
         >
             <div className="hk-task hk-trackb">
-                <HackathonEventBar />
+                <HackathonTopBar />
                 <HackathonTaskSwitch current={HACKATHON_TRACK_B.code} />
 
                 <div className="hk-task__wrap hk-task__grid">
@@ -417,7 +417,7 @@ export function HackathonTrackBPage(): JSX.Element {
                                             <>
                                                 The repository&apos;s pull 
request template (dev + 4.x, English) and one
                                                 line that names your task, 
e.g.{' '}
-                                                <code>CoC 2026 Glasgow 
hackathon · Track B · B1</code>.
+                                                <code>Apache Doris Hackathon · 
Track B · B1</code>.
                                             </>
                                         ),
                                     },
diff --git a/src/components/course/hackathon/hackathonCommon.tsx 
b/src/components/course/hackathon/hackathonCommon.tsx
index 774407deaff..6f666718884 100644
--- a/src/components/course/hackathon/hackathonCommon.tsx
+++ b/src/components/course/hackathon/hackathonCommon.tsx
@@ -19,7 +19,7 @@ export const BEFORE_IMAGE_PULLED: HackathonChecklistItem = {
     title: 'Docker is running and the Doris image is pulled.',
     body: (
         <>
-            About {HACKATHON_DORIS_DOWNLOAD}, once. Pull it before you arrive: 
the venue Wi-Fi is shared. Docker Desktop
+            About {HACKATHON_DORIS_DOWNLOAD}, once. Pull it ahead of time: it 
is a large download. Docker Desktop
             (macOS) and Docker Engine (Linux) both work.
         </>
     ),
@@ -321,7 +321,7 @@ export const TROUBLE = {
         problem: 'Stuck for more than 10 minutes',
         fix: (
             <>
-                Come to the Doris table and ask Mingyu, or post in 
<code>{HACKATHON_EVENT.slackChannel}</code> on the{' '}
+                Post in <code>{HACKATHON_EVENT.slackChannel}</code> on the{' '}
                 <a href={HACKATHON_SLACK_URL}>Apache Doris Slack</a>
             </>
         ),
diff --git a/src/components/course/hackathon/hackathonEvent.ts 
b/src/components/course/hackathon/hackathonEvent.ts
index 67d7067e3c2..dff99523ef0 100644
--- a/src/components/course/hackathon/hackathonEvent.ts
+++ b/src/components/course/hackathon/hackathonEvent.ts
@@ -1,24 +1,19 @@
 import { buildSlackEntryUrl } from 
'@site/src/components/slack-redirect/slack-attribution.logic';
 
-// Temporary pages for the Apache Doris session at the Community over Code 2026
-// hackathon (Glasgow). The /course entry and the four Track A task pages read
-// everything event-specific from here, so the whole hackathon block can be
-// switched off or removed after the event without touching the course itself.
+// Permanent task pages for the Apache Doris Hackathon. The /course entry and
+// the task pages read everything hackathon-specific from here, so the whole
+// hackathon block can be switched off or changed without touching the course
+// itself. Nothing here is tied to a date or a venue.
 
 /** Shows the "Doris 101 | Hackathon" switch in the /course path card. */
 export const HACKATHON_COURSE_TRACK_ENABLED = true;
 
 export const HACKATHON_EVENT = {
     name: 'Apache Doris Hackathon',
-    conference: 'Community over Code 2026',
-    city: 'Glasgow',
-    dateLong: 'Tuesday 13 October',
-    dateShort: 'Tue 13 Oct',
-    time: '11:20–15:00',
-    room: 'Wee Dram Room',
-    eventUrl: 
'https://events.apache.org/events/2026/community-over-code/doris.html',
-    basePath: '/course/hackathon/glasgow-2026',
-    // Set to null to render a dashed "TBA" placeholder instead.
+    basePath: '/course/hackathon',
+    // Set to null to render a dashed "TBA" placeholder instead. The file and
+    // folder names are the published starter-kit artifact; they keep their
+    // original name so existing downloads and submissions stay valid.
     starterKitUrl:
         
'https://github.com/morningman/demo-env/releases/download/for-hackathon/doris-hackathon-glasgow-2026.zip'
 as
             string | null,
@@ -27,15 +22,13 @@ export const HACKATHON_EVENT = {
     /** Participants open a pull request that adds <their GitHub ID>/ under 
this folder. */
     submitUrl: 
'https://github.com/morningman/demo-env/tree/main/doris-hackathon-glasgow-2026' 
as string | null,
     submitLabel: 'morningman/demo-env' as string | null,
-    deadline: '31 October' as string | null,
     /** Apache Doris Slack channel for questions, submissions and badges. */
     slackChannel: '#dev',
 } as const;
 
 /** Tracked entry to the Apache Doris Slack (see 
developer_docs/slack-utm-convention.md). */
 export const HACKATHON_SLACK_URL = buildSlackEntryUrl({
-    medium: 'event',
-    campaign: 'coc2026_hackathon',
+    medium: 'website',
     content: 'hackathon_task_page',
 });
 
@@ -63,7 +56,7 @@ export interface HackathonTaskMeta {
     slug: string;
     title: string;
     duration: string;
-    /** Poster pitch, used on the task tiles. */
+    /** Short pitch, used on the task tiles. */
     pitch: string;
 }
 
@@ -106,7 +99,7 @@ export function getHackathonTask(code: HackathonTaskCode): 
HackathonTaskMeta {
     return task;
 }
 
-/** Site-relative route of a task page, e.g. 
/course/hackathon/glasgow-2026/a1-hybrid-search */
+/** Site-relative route of a task page, e.g. 
/course/hackathon/a1-hybrid-search */
 export function hackathonTaskPath(task: HackathonTaskMeta): string {
     return `${HACKATHON_EVENT.basePath}/${task.slug}`;
 }
diff --git a/src/components/course/hackathon/tasks/a2Mcp.tsx 
b/src/components/course/hackathon/tasks/a2Mcp.tsx
index 36c98fe3941..72fa42e1383 100644
--- a/src/components/course/hackathon/tasks/a2Mcp.tsx
+++ b/src/components/course/hackathon/tasks/a2Mcp.tsx
@@ -113,7 +113,7 @@ export const A2_MCP: HackathonTaskContent = {
             title: 'Python 3.12 or later, with the server installed.',
             body: (
                 <>
-                    Check with <code>python3 --version</code>. Install the 
server before you arrive (milestone 2 has the
+                    Check with <code>python3 --version</code>. Install the 
server ahead of time (milestone 2 has the
                     commands): it pulls in about 80 packages.
                 </>
             ),
diff --git a/src/components/course/hackathon/tasks/trackB.tsx 
b/src/components/course/hackathon/tasks/trackB.tsx
index 4212541484d..9280c918e23 100644
--- a/src/components/course/hackathon/tasks/trackB.tsx
+++ b/src/components/course/hackathon/tasks/trackB.tsx
@@ -246,7 +246,7 @@ export function prTemplate(task: TrackBTask): CodeSnippet {
             '',
             '(Keep the Docs Checklist from the template and tick what 
applies.)',
             '',
-            `CoC 2026 Glasgow hackathon · Track B · ${task.code} 
${task.title}`,
+            `Apache Doris Hackathon · Track B · ${task.code} ${task.title}`,
             '',
             'The key-features pages exist only in English; both copies get the 
same change:',
             ...docFiles(task).map(file => `- ${file}`),
diff --git a/src/components/home-next/SlackCommunityNudge.logic.test.js 
b/src/components/home-next/SlackCommunityNudge.logic.test.js
index 306d4739fce..e40603b3027 100644
--- a/src/components/home-next/SlackCommunityNudge.logic.test.js
+++ b/src/components/home-next/SlackCommunityNudge.logic.test.js
@@ -138,7 +138,7 @@ test('does not show documentation feedback outside docs and 
community pages', ()
 });
 
 test('does not open on its own on the hackathon task pages', () => {
-    ['/course/hackathon', 
'/course/hackathon/glasgow-2026/a1-hybrid-search'].forEach(pathname => {
+    ['/course/hackathon', 
'/course/hackathon/a1-hybrid-search'].forEach(pathname => {
         assert.equal(allowsSlackNudgeAutoOpen(pathname), false, pathname);
     });
     ['/', '/course', '/docs/4.x/key-features/hybrid-search', 
'/course/hackathon-other'].forEach(pathname => {
diff --git a/src/pages/course/hackathon/glasgow-2026/a1-hybrid-search.tsx 
b/src/pages/course/hackathon/a1-hybrid-search.tsx
similarity index 100%
rename from src/pages/course/hackathon/glasgow-2026/a1-hybrid-search.tsx
rename to src/pages/course/hackathon/a1-hybrid-search.tsx
diff --git a/src/pages/course/hackathon/glasgow-2026/a2-mcp.tsx 
b/src/pages/course/hackathon/a2-mcp.tsx
similarity index 100%
rename from src/pages/course/hackathon/glasgow-2026/a2-mcp.tsx
rename to src/pages/course/hackathon/a2-mcp.tsx
diff --git a/src/pages/course/hackathon/glasgow-2026/a3-log-search.tsx 
b/src/pages/course/hackathon/a3-log-search.tsx
similarity index 100%
rename from src/pages/course/hackathon/glasgow-2026/a3-log-search.tsx
rename to src/pages/course/hackathon/a3-log-search.tsx
diff --git a/src/pages/course/hackathon/glasgow-2026/a4-agent-traces.tsx 
b/src/pages/course/hackathon/a4-agent-traces.tsx
similarity index 100%
rename from src/pages/course/hackathon/glasgow-2026/a4-agent-traces.tsx
rename to src/pages/course/hackathon/a4-agent-traces.tsx
diff --git a/src/pages/course/hackathon/glasgow-2026/track-b.tsx 
b/src/pages/course/hackathon/track-b.tsx
similarity index 100%
rename from src/pages/course/hackathon/glasgow-2026/track-b.tsx
rename to src/pages/course/hackathon/track-b.tsx


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to