diff --git a/CLAUDE.md b/CLAUDE.md index 52736ba5..2a809184 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -63,7 +63,7 @@ Community activity happens on a separate Discourse instance. Its display name is - The og:image file is public/og.png and its full URL is https://offon.dev/og.png. - PR preview deployments are served from the gh-pages branch under /pr-preview/pr-{number}/. - The open source challenges content lives in a separate organisation at https://github.com/dynatrace-oss/open-ecosystem-challenges. This is an intentional external link and must never be changed or flagged as a violation. -- The community Discourse instance is at https://community.open-ecosystem.com. Use the `COMMUNITY_URL` constant from `src/data/constants.ts`, never hardcode this URL. +- The community Discourse instance is at https://community.offon.dev. Use the `COMMUNITY_URL` constant from `src/data/constants.ts`, never hardcode this URL. - `COMMUNITY_DISPLAY_NAME` is defined in `src/data/constants.ts` as the user-facing display name for the community URL. Use it for visible text, use `COMMUNITY_URL` for href attributes. --- @@ -221,7 +221,7 @@ When diagnosing a bug, especially in the production build, follow these rules wi - **Build-time fetching:** Discussion data lives in per-level JSON files under `src/data/adventures//-posts.json`. Each file contains only `discussionUrl`, `discussionPosts`, and `totalReplies`. These are refreshed hourly by the GitHub Action in `.github/workflows/refresh-community-data.yml` (runs `scripts/refresh-discussions.mjs`). Components import the JSON dynamically via `import.meta.glob`. - When adding a new adventure level, create its per-level discussion JSON file (`-posts.json`) with a `discussionUrl` field. The refresh script uses this URL to fetch posts. - `scripts/refresh-discussions.mjs`, `scripts/refresh-leaderboard.mjs`, and `scripts/refresh-community-leaders.mjs` each contain a `COMMUNITY_BASE` constant that is a necessary duplicate of `COMMUNITY_URL` in `src/data/constants.ts`. The scripts run in Node and cannot import from `src/`, so the value must be maintained manually in all four places. Always update them together. -- The domain `community.open-ecosystem.com` in the three refresh scripts and `src/data/constants.ts` is the actual Discourse server URL used for API calls at build time. It is not a brand inconsistency. Do not change it to `community.offon.dev` or any other display name. `COMMUNITY_DISPLAY_NAME` in `src/data/constants.ts` is the separate user-facing label shown in the UI. +- The domain `community.offon.dev` in the three refresh scripts and `src/data/constants.ts` is the actual Discourse server URL used for API calls at build time. `COMMUNITY_DISPLAY_NAME` in `src/data/constants.ts` is the separate user-facing label shown in the UI. Always update all four places together. --- diff --git a/scripts/refresh-community-leaders.mjs b/scripts/refresh-community-leaders.mjs index 24177cca..bab7e2d6 100644 --- a/scripts/refresh-community-leaders.mjs +++ b/scripts/refresh-community-leaders.mjs @@ -24,8 +24,7 @@ * Writes: * src/data/community-leaders.json * - * NOTE: community.open-ecosystem.com here is the actual Discourse server URL. - * It is not the same as the display name community.offon.dev. Do not change it. + * NOTE: community.offon.dev is the actual Discourse server URL. */ import { readFileSync, writeFileSync, existsSync } from "node:fs"; @@ -35,7 +34,7 @@ import { fileURLToPath } from "node:url"; const __dirname = dirname(fileURLToPath(import.meta.url)); const ROOT = resolve(__dirname, ".."); const OUT_PATH = resolve(ROOT, "src/data/community-leaders.json"); -const COMMUNITY_BASE = "https://community.open-ecosystem.com"; +const COMMUNITY_BASE = "https://community.offon.dev"; // Query IDs in Discourse Data Explorer. const COMMUNITY_QUERY_ID = 7; @@ -82,7 +81,7 @@ function buildAvatarUrl(username, uploadedAvatarId, size = AVATAR_SIZE) { const letter = username.charAt(0).toLowerCase(); return `https://avatars.discourse-cdn.com/v4/letter/${letter}/b5a626/${size}.png`; } - return `${COMMUNITY_BASE}/user_avatar/community.open-ecosystem.com/${encodeURIComponent(username)}/${size}/${uploadedAvatarId}_2.png`; + return `${COMMUNITY_BASE}/user_avatar/community.offon.dev/${encodeURIComponent(username)}/${size}/${uploadedAvatarId}_2.png`; } async function runQuery(queryId, params, apiKey, apiUsername) { diff --git a/scripts/refresh-discussions.mjs b/scripts/refresh-discussions.mjs index 0f96ab9f..ff453df5 100644 --- a/scripts/refresh-discussions.mjs +++ b/scripts/refresh-discussions.mjs @@ -13,7 +13,7 @@ import { join, resolve, dirname } from "node:path"; import { fileURLToPath } from "node:url"; const __dirname = dirname(fileURLToPath(import.meta.url)); -const COMMUNITY_BASE = "https://community.open-ecosystem.com"; +const COMMUNITY_BASE = "https://community.offon.dev"; const ADVENTURES_DIR = resolve(__dirname, "../src/data/adventures"); /** diff --git a/scripts/refresh-leaderboard.mjs b/scripts/refresh-leaderboard.mjs index d6af1045..ee14fcce 100644 --- a/scripts/refresh-leaderboard.mjs +++ b/scripts/refresh-leaderboard.mjs @@ -16,9 +16,7 @@ * Writes per-adventure leaderboard data to: * src/data/adventures//leaderboard.json * - * NOTE: community.open-ecosystem.com here is the actual Discourse server URL used - * for API calls. It is not the same as the display name community.offon.dev. - * Do not change it. See CLAUDE.md for context. + * NOTE: community.offon.dev is the actual Discourse server URL used for API calls. */ import { readFileSync, writeFileSync, existsSync } from "node:fs"; @@ -28,12 +26,12 @@ import { fileURLToPath } from "node:url"; const __dirname = dirname(fileURLToPath(import.meta.url)); const ROOT = resolve(__dirname, ".."); const ADVENTURES_DIR = resolve(ROOT, "src/data/adventures"); -const COMMUNITY_BASE = "https://community.open-ecosystem.com"; +const COMMUNITY_BASE = "https://community.offon.dev"; const QUERY_ID = 5; // Maps adventure ID -> Discourse category ID and which difficulty levels are active. // Update this when a new adventure is added. -// Category IDs are from: GET https://community.open-ecosystem.com/categories.json +// Category IDs are from: GET https://community.offon.dev/categories.json const ADVENTURE_CATEGORIES = { "echoes-lost-in-orbit": { categoryId: 35, has_beginner: true, has_intermediate: true, has_expert: true, has_single: false }, "building-cloudhaven": { categoryId: 36, has_beginner: true, has_intermediate: true, has_expert: true, has_single: false }, diff --git a/src/components/ConsentBanner.tsx b/src/components/ConsentBanner.tsx index d08c7679..15f7ae11 100644 --- a/src/components/ConsentBanner.tsx +++ b/src/components/ConsentBanner.tsx @@ -7,15 +7,19 @@ export function ConsentBanner(): JSX.Element | null { const { consent, grant, deny, reset } = useConsent(); const [mounted, setMounted] = useState(false); const declineRef = useRef(null); + const prevConsentRef = useRef(undefined); useEffect(() => { setMounted(true); // eslint-disable-line react-hooks/set-state-in-effect -- mount guard; SSG requires a safe default (null) on first render so the banner is absent from prerendered HTML and cannot become the LCP element }, []); - // Move focus to Decline when the banner appears (initial visit or after reset) - // so keyboard users are not left with focus stranded on an unmounted button. + // Move focus to Decline only when the banner reappears after a reset (consent + // transitions from non-null to null). Skips the initial page-load case so the + // banner never steals focus from the skip nav link. useEffect(() => { - if (mounted && consent === null) { + const prevConsent = prevConsentRef.current; + prevConsentRef.current = consent; + if (mounted && consent === null && prevConsent != null) { declineRef.current?.focus(); } }, [mounted, consent]); diff --git a/src/data/adventures/blind-by-design/beginner-posts.json b/src/data/adventures/blind-by-design/beginner-posts.json index 2aa1f786..7d966472 100644 --- a/src/data/adventures/blind-by-design/beginner-posts.json +++ b/src/data/adventures/blind-by-design/beginner-posts.json @@ -1,20 +1,20 @@ { - "discussionUrl": "https://community.open-ecosystem.com/t/wire-openfeature-flagd-into-a-spring-boot-service-with-zero-setup-adventure-04-beginner/1419", + "discussionUrl": "https://community.offon.dev/t/wire-openfeature-flagd-into-a-spring-boot-service-with-zero-setup-adventure-04-beginner/1419", "discussionPosts": [ { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "cooked": "It was a cool challenge. Thanks, Simon. Tip: For me, when Codespaces started, the ports were private. After changing the port visibility to Public, the website started to load; otherwise, we got a 502 error.", "created_at": "2026-05-05T07:27:53.930Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/wire-openfeature-flagd-into-a-spring-boot-service-with-zero-setup-adventure-04-beginner/1419" + "topicUrl": "https://community.offon.dev/t/wire-openfeature-flagd-into-a-spring-boot-service-with-zero-setup-adventure-04-beginner/1419" } ], "totalReplies": 1, "solvers": [ { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "solvedAt": "2026-05-05T07:27:53.930Z" } ] diff --git a/src/data/adventures/blind-by-design/expert-posts.json b/src/data/adventures/blind-by-design/expert-posts.json index b15100b5..71ee90c2 100644 --- a/src/data/adventures/blind-by-design/expert-posts.json +++ b/src/data/adventures/blind-by-design/expert-posts.json @@ -1,20 +1,20 @@ { - "discussionUrl": "https://community.open-ecosystem.com/t/read-the-chart-adventure-04-expert/1530", + "discussionUrl": "https://community.offon.dev/t/read-the-chart-adventure-04-expert/1530", "discussionPosts": [ { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "cooked": "Done with the challenge!!! — CERTIFICATE START — Adventure: 04-blind-by-design Level: expert User: Harithsa, Vishruth Repo: theharithsa/open-ecosystem-challenges Date: Wed May 20 12:19:44 PM UTC 2026 Url: — CERTIFICATE END — It is so satisfying to see traces flowing and turn on the lights without redeploying the lab. It was a fun challenge. Thanks again @simon.schrottner and thanks for posting @KatharinaSick", "created_at": "2026-05-20T12:25:39.159Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/read-the-chart-adventure-04-expert/1530" + "topicUrl": "https://community.offon.dev/t/read-the-chart-adventure-04-expert/1530" } ], "totalReplies": 1, "solvers": [ { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "solvedAt": "2026-05-20T12:25:39.159Z" } ] diff --git a/src/data/adventures/blind-by-design/intermediate-posts.json b/src/data/adventures/blind-by-design/intermediate-posts.json index 000888c8..ba6c0f7a 100644 --- a/src/data/adventures/blind-by-design/intermediate-posts.json +++ b/src/data/adventures/blind-by-design/intermediate-posts.json @@ -1,20 +1,20 @@ { - "discussionUrl": "https://community.open-ecosystem.com/t/outcome-by-cohort-adventure-04-intermediate/1485", + "discussionUrl": "https://community.offon.dev/t/outcome-by-cohort-adventure-04-intermediate/1485", "discussionPosts": [ { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "cooked": "Intermediate Challenge Accepted and Completed!! These challenges are getting more fun with each new one. I’m learning many in-depth things about OSS and Observability. --- CERTIFICATE START --- Adventure: 04-blind-by-design Level: intermediate User: Harithsa, Vishruth Repo: theharithsa/open-ecosystem-challenges Date: Tue May 19 04:30:36 AM UTC 2026 Url: --- CERTIFICATE END --- I encountered one issue when pushing the final changes to GitHub. The application generates an app.log file, which needs to be added to the .gitignore file before committing the changes to Git. Otherwise, the ./verify.sh script incorrectly reports uncommitted changes in the repository.", "created_at": "2026-05-19T04:37:22.351Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/outcome-by-cohort-adventure-04-intermediate/1485" + "topicUrl": "https://community.offon.dev/t/outcome-by-cohort-adventure-04-intermediate/1485" } ], "totalReplies": 1, "solvers": [ { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "solvedAt": "2026-05-19T04:37:22.351Z" } ] diff --git a/src/data/adventures/blind-by-design/leaderboard.json b/src/data/adventures/blind-by-design/leaderboard.json index a65b2cb4..b73fe966 100644 --- a/src/data/adventures/blind-by-design/leaderboard.json +++ b/src/data/adventures/blind-by-design/leaderboard.json @@ -4,7 +4,7 @@ { "rank": 1, "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/90/297.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/90/297.png", "points": 300, "challengesSolved": 3, "beginnerPoints": 100, diff --git a/src/data/adventures/building-cloudhaven/beginner-posts.json b/src/data/adventures/building-cloudhaven/beginner-posts.json index c7bea95f..9f8f8660 100644 --- a/src/data/adventures/building-cloudhaven/beginner-posts.json +++ b/src/data/adventures/building-cloudhaven/beginner-posts.json @@ -1,35 +1,35 @@ { - "discussionUrl": "https://community.open-ecosystem.com/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656", + "discussionUrl": "https://community.offon.dev/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656", "discussionPosts": [ { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "The intermediate level is now live: Adventure 02: Building CloudHaven | Intermediate: The Modular Metropolis", "created_at": "2026-01-21T13:02:00.099Z", - "topicUrl": "https://community.open-ecosystem.com/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" + "topicUrl": "https://community.offon.dev/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "Thanks for letting us know! I’ll take a look. I hope it didn’t cost you too much time", "created_at": "2026-01-18T05:22:50.240Z", - "topicUrl": "https://community.open-ecosystem.com/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" + "topicUrl": "https://community.offon.dev/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" }, { "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/40/140_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/40/140_2.png", "cooked": "Had to rerun the post-start.sh script to get the gcp “credentials” to work.", "created_at": "2026-01-18T04:11:43.746Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" + "topicUrl": "https://community.offon.dev/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "cooked": "Done", "created_at": "2026-01-16T18:02:15.040Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" + "topicUrl": "https://community.offon.dev/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" }, { "username": "alvin", @@ -37,29 +37,29 @@ "cooked": "Thanks for the challenge!", "created_at": "2026-01-14T23:51:19.893Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" + "topicUrl": "https://community.offon.dev/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" }, { "username": "DavidHirsch", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/davidhirsch/40/8_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/davidhirsch/40/8_2.png", "cooked": "Wow you are definitely the fastest challenger!", "created_at": "2026-01-12T21:28:18.279Z", - "topicUrl": "https://community.open-ecosystem.com/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" + "topicUrl": "https://community.offon.dev/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" }, { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "cooked": "Completed the challenge.", "created_at": "2026-01-12T21:22:52.209Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" + "topicUrl": "https://community.offon.dev/t/practice-infrastructure-as-code-with-zero-setup-adventure-02-beginner/656" } ], "totalReplies": 7, "solvers": [ { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "solvedAt": "2026-01-12T21:22:52.209Z" }, { @@ -69,12 +69,12 @@ }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "solvedAt": "2026-01-16T18:02:15.040Z" }, { "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/40/140_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/40/140_2.png", "solvedAt": "2026-01-18T04:11:43.746Z" } ] diff --git a/src/data/adventures/building-cloudhaven/expert-posts.json b/src/data/adventures/building-cloudhaven/expert-posts.json index 5f67dc56..975dbf80 100644 --- a/src/data/adventures/building-cloudhaven/expert-posts.json +++ b/src/data/adventures/building-cloudhaven/expert-posts.json @@ -1,74 +1,74 @@ { - "discussionUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8", + "discussionUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8", "discussionPosts": [ { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "cooked": "Confirming that the pipeline finished with success , thank you !!", "created_at": "2026-02-03T13:06:38.787Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "I just pushed a fix. The problem was that the verification action checked if the severity field is set but it actually defaults to all vulnerability types anyways. Thanks again for bringing this up and for playing", "created_at": "2026-02-03T11:48:08.245Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "cooked": "Ok thank u for the fast response", "created_at": "2026-02-02T21:15:58.997Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "I just checked your action and it looks good Seems like you ran into an edge case I didn’t consider with validation again. I’m really sorry! I’ll update the validation workflow tomorrow and let you know once it’s fixed Your points will of course be awarded from today instead of tomorrow then.", "created_at": "2026-02-02T18:56:18.374Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "cooked": "Hello guys i think i need some help , so i followed the instruction on the challenge and did all the drill and run the smoke teskt with sucess as you see in the image : but when i go to run the validate adventure pipeline it fails with this error : I understand that it is asking me to have a closer look at the security job specifically at step but i have aready what its asking - name: 🔒 Scan for Vulnerabilities uses: aquasecurity/trivy-action@0.33.1 with: scan-type: 'config' scan-ref: ${{ env.WORKING_DIR }} format: 'json' output: 'vulnerabilities.json' exit-code: 0", "created_at": "2026-02-02T16:32:48.480Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" }, { "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/40/140_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/40/140_2.png", "cooked": "Completed the challenge.", "created_at": "2026-02-01T21:50:15.316Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" }, { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "cooked": "Completed the challenge.", "created_at": "2026-01-31T14:09:48.909Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-expert-the-guardian-protocols/782/8" } ], "totalReplies": 7, "solvers": [ { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "solvedAt": "2026-01-31T14:09:48.909Z" }, { "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/40/140_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/40/140_2.png", "solvedAt": "2026-02-01T21:50:15.316Z" }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "solvedAt": "2026-02-02T16:32:48.480Z" } ] diff --git a/src/data/adventures/building-cloudhaven/intermediate-posts.json b/src/data/adventures/building-cloudhaven/intermediate-posts.json index fc5f4624..d80c25b8 100644 --- a/src/data/adventures/building-cloudhaven/intermediate-posts.json +++ b/src/data/adventures/building-cloudhaven/intermediate-posts.json @@ -1,81 +1,81 @@ { - "discussionUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10", + "discussionUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10", "discussionPosts": [ { "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/40/140_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/40/140_2.png", "cooked": "almost fell behind", "created_at": "2026-02-01T18:19:45.928Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "The expert level is now live. And the deadline for all 3 levels has been extended until Wednesday, 4 February 2026 at 23:59 CET Adventure 02: Building CloudHaven | Expert: The Guardian Protocols", "created_at": "2026-01-30T05:27:19.278Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" }, { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "cooked": "Completed the challenge.", "created_at": "2026-01-24T14:53:00.108Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "cooked": "Good Morning Thank u for the fast reaponse and for updating the ci pipeline indeed the hints were very helpfull. Just confirming that on my side is all good now. Regrads", "created_at": "2026-01-22T09:42:45.887Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "Good morning, I took a look at your adventure and there are still a few tiny things missing. I had a hard time with the smoke test on this one as I couldn’t test if e.g. all necessary conditions are covered in the integration test. By looking at your code, I realized that the GitHub action verification script is definitely not giving away enough information to make up for the smoke test. Therefore, I added some more hints there in case something fails. If you rerun it and then open the logs for your run, you should see much more details. Thanks again for reporting and have fun playing", "created_at": "2026-01-22T07:39:04.233Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "Oh no. Thanks for reporting and sorry for the inconveniences! I’ll take a look and get back to you once it’s fixed.", "created_at": "2026-01-21T15:14:37.154Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "cooked": "Hello i managed to find the solution but when i try to run the ci pipeline i get an error:", "created_at": "2026-01-21T15:11:09.831Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "Hey Unfortunately, this would create too much overlap with the February adventure that is coming next month. Sorry! But in theory, you should be able to run the challenge locally as GitHub Codespaces are just devcontainers in the end. Also, the deadline just means that no points will be rewarded afterwards. You can always play all past challenges for learning. I created a GitHub issue to take a look at local execution as well:", "created_at": "2026-01-21T13:00:49.192Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" + "topicUrl": "https://community.offon.dev/t/adventure-02-building-cloudhaven-intermediate-the-modular-metropolis/723/10" } ], "totalReplies": 9, "solvers": [ { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "solvedAt": "2026-01-21T15:11:09.831Z" }, { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "solvedAt": "2026-01-24T14:53:00.108Z" }, { "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/40/140_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/40/140_2.png", "solvedAt": "2026-02-01T18:19:45.928Z" } ] diff --git a/src/data/adventures/building-cloudhaven/leaderboard.json b/src/data/adventures/building-cloudhaven/leaderboard.json index 9f7d08a6..de5fadba 100644 --- a/src/data/adventures/building-cloudhaven/leaderboard.json +++ b/src/data/adventures/building-cloudhaven/leaderboard.json @@ -4,7 +4,7 @@ { "rank": 1, "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/90/99.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/90/99.png", "points": 295, "challengesSolved": 3, "beginnerPoints": 100, @@ -16,7 +16,7 @@ { "rank": 2, "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/90/165.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/90/165.png", "points": 280, "challengesSolved": 3, "beginnerPoints": 90, @@ -28,7 +28,7 @@ { "rank": 3, "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/90/140.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/90/140.png", "points": 240, "challengesSolved": 3, "beginnerPoints": 85, @@ -40,7 +40,7 @@ { "rank": 4, "username": "alvin", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/alvin/90/1.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/alvin/90/1.png", "points": 95, "challengesSolved": 1, "beginnerPoints": 95, diff --git a/src/data/adventures/echoes-lost-in-orbit/beginner-posts.json b/src/data/adventures/echoes-lost-in-orbit/beginner-posts.json index 0783f081..74ca8023 100644 --- a/src/data/adventures/echoes-lost-in-orbit/beginner-posts.json +++ b/src/data/adventures/echoes-lost-in-orbit/beginner-posts.json @@ -1,95 +1,95 @@ { - "discussionUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40", + "discussionUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40", "discussionPosts": [ { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "There’s another beginner challenge available now. It’s about Infrastructure as Code with OpenTofu. I hope you enjoy it Practice Infrastructure as Code with Zero Setup ( Adventure 02 | Beginner)", "created_at": "2026-01-14T10:12:21.186Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "cooked": "Done", "created_at": "2025-12-09T22:06:24.552Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "No, you can also sync your fork to get the latest changes. You can find more details on how to do that here: Have fun playing", "created_at": "2025-12-08T19:37:35.002Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" }, { "username": "RoelofW", "avatarUrl": "https://avatars.discourse-cdn.com/v4/letter/r/eb8c5e/40.png", "cooked": "Do I need to fork it again if I have a fork on my own github repo with the easy one ?", "created_at": "2025-12-08T19:17:46.692Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "The intermediate challenge of this adventure is now live:", "created_at": "2025-12-08T09:38:42.412Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" }, { "username": "yerakh-dyn", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/yerakh-dyn/40/157_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/yerakh-dyn/40/157_2.png", "cooked": "Done", "created_at": "2025-12-04T09:01:42.977Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "No, that should be preinstalled @macca728. Could it be, that you started the Codespace with the default configuration instead of “Adventure 01 | Beginner (Broken Echoes)“? You can find more details about that here:", "created_at": "2025-12-04T05:36:57.191Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" }, { "username": "macca728", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/macca728/40/156_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/macca728/40/156_2.png", "cooked": "Never used codespaces before, but when tying to run the smoke-test.sh I get this error: $ ./smoke-test.sh /workspaces/open-ecosystem-challenges/lib/output.sh: line 6: gum: command not found Is fixing this part of the challenge?", "created_at": "2025-12-04T04:28:54.626Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-easy-broken-echoes/117/40" } ], "totalReplies": 37, "solvers": [ { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "solvedAt": "2025-11-21T08:48:02.790Z" }, { "username": "JoshHendrick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/joshhendrick/40/45_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/joshhendrick/40/45_2.png", "solvedAt": "2025-11-23T19:47:45.300Z" }, { "username": "rohit_bc", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/rohit_bc/40/164_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/rohit_bc/40/164_2.png", "solvedAt": "2025-11-25T15:20:40.122Z" }, { "username": "daniel.y.rigney", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/daniel.y.rigney/40/106_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/daniel.y.rigney/40/106_2.png", "solvedAt": "2025-11-25T21:08:31.028Z" }, { "username": "Jelleby", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/jelleby/40/113_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/jelleby/40/113_2.png", "solvedAt": "2025-11-25T21:20:12.884Z" }, { "username": "georgblumenschein", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/georgblumenschein/40/116_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/georgblumenschein/40/116_2.png", "solvedAt": "2025-11-26T10:15:59.893Z" }, { @@ -99,12 +99,12 @@ }, { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "solvedAt": "2025-11-26T14:47:48.141Z" }, { "username": "jayroam", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/jayroam/40/130_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/jayroam/40/130_2.png", "solvedAt": "2025-11-27T08:23:52.987Z" }, { @@ -114,27 +114,27 @@ }, { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "solvedAt": "2025-11-28T09:11:04.341Z" }, { "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/40/140_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/40/140_2.png", "solvedAt": "2025-11-29T17:53:47.161Z" }, { "username": "mikeadityas", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/mikeadityas/40/144_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/mikeadityas/40/144_2.png", "solvedAt": "2025-12-01T14:35:04.710Z" }, { "username": "yerakh-dyn", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/yerakh-dyn/40/157_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/yerakh-dyn/40/157_2.png", "solvedAt": "2025-12-04T09:01:42.977Z" }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "solvedAt": "2025-12-09T22:06:24.552Z" } ] diff --git a/src/data/adventures/echoes-lost-in-orbit/expert-posts.json b/src/data/adventures/echoes-lost-in-orbit/expert-posts.json index e7e5cc5d..974a49bc 100644 --- a/src/data/adventures/echoes-lost-in-orbit/expert-posts.json +++ b/src/data/adventures/echoes-lost-in-orbit/expert-posts.json @@ -1,46 +1,46 @@ { - "discussionUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-expert-hyperspace-operations-transport/351/4", + "discussionUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-expert-hyperspace-operations-transport/351/4", "discussionPosts": [ { "username": "georgblumenschein", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/georgblumenschein/40/116_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/georgblumenschein/40/116_2.png", "cooked": "Completed the challenge.", "created_at": "2026-01-07T13:42:55.927Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-expert-hyperspace-operations-transport/351/4" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-expert-hyperspace-operations-transport/351/4" }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "cooked": "DONE", "created_at": "2025-12-26T17:49:20.719Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-expert-hyperspace-operations-transport/351/4" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-expert-hyperspace-operations-transport/351/4" }, { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "cooked": "Completed the challenge.", "created_at": "2025-12-26T12:58:27.995Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-expert-hyperspace-operations-transport/351/4" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-expert-hyperspace-operations-transport/351/4" } ], "totalReplies": 3, "solvers": [ { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "solvedAt": "2025-12-26T12:58:27.995Z" }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "solvedAt": "2025-12-26T17:49:20.719Z" }, { "username": "georgblumenschein", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/georgblumenschein/40/116_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/georgblumenschein/40/116_2.png", "solvedAt": "2026-01-07T13:42:55.927Z" } ] diff --git a/src/data/adventures/echoes-lost-in-orbit/intermediate-posts.json b/src/data/adventures/echoes-lost-in-orbit/intermediate-posts.json index a4be90af..a934beb2 100644 --- a/src/data/adventures/echoes-lost-in-orbit/intermediate-posts.json +++ b/src/data/adventures/echoes-lost-in-orbit/intermediate-posts.json @@ -1,21 +1,21 @@ { - "discussionUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8", + "discussionUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8", "discussionPosts": [ { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "cooked": "Completed the challenge.", "created_at": "2025-12-23T16:41:34.409Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" }, { "username": "georgblumenschein", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/georgblumenschein/40/116_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/georgblumenschein/40/116_2.png", "cooked": "Completed the challenge.", "created_at": "2025-12-17T18:43:16.096Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" }, { "username": "alvin", @@ -23,49 +23,49 @@ "cooked": "Success! Verify Adventure · malv3/open-ecosystem-challenges@9fb19d5", "created_at": "2025-12-13T10:10:29.720Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" }, { "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/40/140_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/40/140_2.png", "cooked": "thanks again for hosting these", "created_at": "2025-12-10T04:39:36.761Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "cooked": "Confirming that is all good now the pipeline finished with success thank u for providing such challenges and facilitations to practice , looking forward to the next challenge on 22/12", "created_at": "2025-12-09T13:26:56.684Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "Thanks for letting us know @enri-kapaj and a big sorry, for the bad experience you had. There was a bug in the verification logic but if you re-run the verification workflow now, it should succeed. I hope you had fun with the rest of the challenge", "created_at": "2025-12-09T12:44:23.913Z", - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "cooked": "Hello i tried this challenge and everything went just fine and i run the smoke test locally all good but the pieline fails with not so specific error or at least it shows me errors, it looks to me like its not reading the repo currently : here is the pipline link in case for more details :", "created_at": "2025-12-09T12:13:31.717Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" + "topicUrl": "https://community.offon.dev/t/adventure-01-echoes-lost-in-orbit-intermediate-the-silent-canary/310/8" } ], "totalReplies": 7, "solvers": [ { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "solvedAt": "2025-12-09T12:13:31.717Z" }, { "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/40/140_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/40/140_2.png", "solvedAt": "2025-12-10T04:39:36.761Z" }, { @@ -75,12 +75,12 @@ }, { "username": "georgblumenschein", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/georgblumenschein/40/116_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/georgblumenschein/40/116_2.png", "solvedAt": "2025-12-17T18:43:16.096Z" }, { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "solvedAt": "2025-12-23T16:41:34.409Z" } ] diff --git a/src/data/adventures/echoes-lost-in-orbit/leaderboard.json b/src/data/adventures/echoes-lost-in-orbit/leaderboard.json index ba4faae3..58cdb946 100644 --- a/src/data/adventures/echoes-lost-in-orbit/leaderboard.json +++ b/src/data/adventures/echoes-lost-in-orbit/leaderboard.json @@ -4,7 +4,7 @@ { "rank": 1, "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/90/165.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/90/165.png", "points": 255, "challengesSolved": 3, "beginnerPoints": 60, @@ -16,7 +16,7 @@ { "rank": 2, "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/90/99.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/90/99.png", "points": 220, "challengesSolved": 3, "beginnerPoints": 60, @@ -28,7 +28,7 @@ { "rank": 3, "username": "georgblumenschein", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/georgblumenschein/90/116.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/georgblumenschein/90/116.png", "points": 195, "challengesSolved": 3, "beginnerPoints": 75, @@ -40,7 +40,7 @@ { "rank": 4, "username": "alvin", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/alvin/90/1.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/alvin/90/1.png", "points": 160, "challengesSolved": 2, "beginnerPoints": 70, @@ -52,7 +52,7 @@ { "rank": 5, "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/90/140.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/90/140.png", "points": 155, "challengesSolved": 2, "beginnerPoints": 60, @@ -64,7 +64,7 @@ { "rank": 6, "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/KatharinaSick/90/9.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/KatharinaSick/90/9.png", "points": 100, "challengesSolved": 1, "beginnerPoints": 100, @@ -76,7 +76,7 @@ { "rank": 7, "username": "JoshHendrick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/JoshHendrick/90/45.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/JoshHendrick/90/45.png", "points": 95, "challengesSolved": 1, "beginnerPoints": 95, @@ -88,7 +88,7 @@ { "rank": 8, "username": "rohit_bc", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/rohit_bc/90/164.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/rohit_bc/90/164.png", "points": 90, "challengesSolved": 1, "beginnerPoints": 90, @@ -100,7 +100,7 @@ { "rank": 9, "username": "daniel.y.rigney", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/daniel.y.rigney/90/106.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/daniel.y.rigney/90/106.png", "points": 85, "challengesSolved": 1, "beginnerPoints": 85, @@ -112,7 +112,7 @@ { "rank": 10, "username": "Jelleby", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/Jelleby/90/113.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/Jelleby/90/113.png", "points": 80, "challengesSolved": 1, "beginnerPoints": 80, @@ -124,7 +124,7 @@ { "rank": 11, "username": "RoelofW", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/RoelofW/90/1.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/RoelofW/90/1.png", "points": 70, "challengesSolved": 1, "beginnerPoints": 70, @@ -136,7 +136,7 @@ { "rank": 12, "username": "jayroam", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/jayroam/90/130.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/jayroam/90/130.png", "points": 70, "challengesSolved": 1, "beginnerPoints": 70, @@ -148,7 +148,7 @@ { "rank": 13, "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/90/297.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/90/297.png", "points": 70, "challengesSolved": 1, "beginnerPoints": 70, @@ -160,7 +160,7 @@ { "rank": 14, "username": "yerakh-dyn", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/yerakh-dyn/90/157.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/yerakh-dyn/90/157.png", "points": 60, "challengesSolved": 1, "beginnerPoints": 60, @@ -172,7 +172,7 @@ { "rank": 15, "username": "mikeadityas", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/mikeadityas/90/144.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/mikeadityas/90/144.png", "points": 60, "challengesSolved": 1, "beginnerPoints": 60, diff --git a/src/data/adventures/the-ai-observatory/beginner-posts.json b/src/data/adventures/the-ai-observatory/beginner-posts.json index 80dc2af2..a416a146 100644 --- a/src/data/adventures/the-ai-observatory/beginner-posts.json +++ b/src/data/adventures/the-ai-observatory/beginner-posts.json @@ -1,49 +1,49 @@ { - "discussionUrl": "https://community.open-ecosystem.com/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8", + "discussionUrl": "https://community.offon.dev/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8", "discussionPosts": [ { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "cooked": "Good Challenge for beginners.", "created_at": "2026-04-08T04:51:26.980Z", - "topicUrl": "https://community.open-ecosystem.com/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" + "topicUrl": "https://community.offon.dev/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "Expert is now live Reduce Telemetry Noise: Adventure 03 | Expert is Live!", "created_at": "2026-02-28T09:06:54.180Z", - "topicUrl": "https://community.open-ecosystem.com/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" + "topicUrl": "https://community.offon.dev/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "Ready to instrument & debug a full RAG pipeline? Head over to Instrument & Debug a RAG Pipeline: Adventure 03 | Intermediate is Live! to play", "created_at": "2026-02-20T15:04:24.610Z", - "topicUrl": "https://community.open-ecosystem.com/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" + "topicUrl": "https://community.offon.dev/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" }, { "username": "rohit_bc", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/rohit_bc/40/164_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/rohit_bc/40/164_2.png", "cooked": "— CERTIFICATE START — Adventure: 03-the-ai-observatory Level: beginner User: rohitbc23 Repo: rohitbc23/open-ecosystem-challenges Date: Sat 14 Feb 2026 10:04:53 PM UTC Url: — CERTIFICATE END —", "created_at": "2026-02-14T22:05:45.322Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" + "topicUrl": "https://community.offon.dev/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "Hey all Sorry for the short notice, but there will be no challenge today. The intermediate level will follow next week. Enjoy your weekend!", "created_at": "2026-02-13T07:58:53.285Z", - "topicUrl": "https://community.open-ecosystem.com/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" + "topicUrl": "https://community.offon.dev/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" }, { "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/40/140_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/40/140_2.png", "cooked": "— CERTIFICATE START — Adventure: 03-the-ai-observatory Level: beginner User: justinrand Repo: justinrand/open-ecosystem-challenges Date: Sun 08 Feb 2026 03:54:33 AM UTC Url: — CERTIFICATE END —", "created_at": "2026-02-08T03:55:32.247Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" + "topicUrl": "https://community.offon.dev/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" }, { "username": "alvin", @@ -51,22 +51,22 @@ "cooked": "Thanks for the challenge — CERTIFICATE START — Adventure: 03-the-ai-observatory Level: beginner User: malv3 Repo: malv3/open-ecosystem-challenges Date: Sat 07 Feb 2026 02:05:11 AM UTC Url: — CERTIFICATE END —", "created_at": "2026-02-07T02:06:26.962Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" + "topicUrl": "https://community.offon.dev/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" }, { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "cooked": "— CERTIFICATE START — Adventure: 03-the-ai-observatory Level: beginner User: Gerald Sigmund Repo: gsigmund/open-ecosystem-challenges Date: Fri 06 Feb 2026 01:27:07 PM UTC Url: — CERTIFICATE END — Nice challenge looking forward how this continues", "created_at": "2026-02-06T13:27:59.557Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" + "topicUrl": "https://community.offon.dev/t/instrument-your-first-llm-adventure-03-beginner-is-live/865/8" } ], "totalReplies": 8, "solvers": [ { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "solvedAt": "2026-02-06T13:27:59.557Z" }, { @@ -76,12 +76,12 @@ }, { "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/40/140_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/40/140_2.png", "solvedAt": "2026-02-08T03:55:32.247Z" }, { "username": "rohit_bc", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/rohit_bc/40/164_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/rohit_bc/40/164_2.png", "solvedAt": "2026-02-14T22:05:45.322Z" } ] diff --git a/src/data/adventures/the-ai-observatory/expert-posts.json b/src/data/adventures/the-ai-observatory/expert-posts.json index 7b8c5b52..17e4757f 100644 --- a/src/data/adventures/the-ai-observatory/expert-posts.json +++ b/src/data/adventures/the-ai-observatory/expert-posts.json @@ -1,12 +1,12 @@ { - "discussionUrl": "https://community.open-ecosystem.com/t/reduce-telemetry-noise-adventure-03-expert-is-live/999/1", + "discussionUrl": "https://community.offon.dev/t/reduce-telemetry-noise-adventure-03-expert-is-live/999/1", "discussionPosts": [ { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "cooked": "I know time for this challenge is over but still tried the challenge and it was fun.", "created_at": "2026-04-08T04:02:29.231Z", - "topicUrl": "https://community.open-ecosystem.com/t/reduce-telemetry-noise-adventure-03-expert-is-live/999/1" + "topicUrl": "https://community.offon.dev/t/reduce-telemetry-noise-adventure-03-expert-is-live/999/1" } ], "totalReplies": 1, diff --git a/src/data/adventures/the-ai-observatory/intermediate-posts.json b/src/data/adventures/the-ai-observatory/intermediate-posts.json index 83f7180a..27658379 100644 --- a/src/data/adventures/the-ai-observatory/intermediate-posts.json +++ b/src/data/adventures/the-ai-observatory/intermediate-posts.json @@ -1,47 +1,47 @@ { - "discussionUrl": "https://community.open-ecosystem.com/t/instrument-debug-a-rag-pipeline-adventure-03-intermediate-is-live/936/2", + "discussionUrl": "https://community.offon.dev/t/instrument-debug-a-rag-pipeline-adventure-03-intermediate-is-live/936/2", "discussionPosts": [ { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "cooked": "Done with the challenge as well.", "created_at": "2026-04-08T06:08:13.206Z", - "topicUrl": "https://community.open-ecosystem.com/t/instrument-debug-a-rag-pipeline-adventure-03-intermediate-is-live/936/2" + "topicUrl": "https://community.offon.dev/t/instrument-debug-a-rag-pipeline-adventure-03-intermediate-is-live/936/2" }, { "username": "rohit_bc", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/rohit_bc/40/164_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/rohit_bc/40/164_2.png", "cooked": "— CERTIFICATE START — Adventure: 03-the-ai-observatory Level: intermediate User: rohitbc23 Repo: rohitbc23/open-ecosystem-challenges Date: Tue 03 Mar 2026 08:13:10 PM UTC Url: — CERTIFICATE END —", "created_at": "2026-03-03T20:14:12.768Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/instrument-debug-a-rag-pipeline-adventure-03-intermediate-is-live/936/2" + "topicUrl": "https://community.offon.dev/t/instrument-debug-a-rag-pipeline-adventure-03-intermediate-is-live/936/2" }, { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/katharinasick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/katharinasick/40/9_2.png", "cooked": "Expert is now live Reduce Telemetry Noise: Adventure 03 | Expert is Live!", "created_at": "2026-02-28T09:06:39.678Z", - "topicUrl": "https://community.open-ecosystem.com/t/instrument-debug-a-rag-pipeline-adventure-03-intermediate-is-live/936/2" + "topicUrl": "https://community.offon.dev/t/instrument-debug-a-rag-pipeline-adventure-03-intermediate-is-live/936/2" }, { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "cooked": "— CERTIFICATE START — Adventure: 03-the-ai-observatory Level: intermediate User: Gerald Sigmund Repo: unknown Date: Sat 21 Feb 2026 05:59:20 PM UTC Url: — CERTIFICATE END —", "created_at": "2026-02-21T18:00:30.823Z", "challengeSolved": true, - "topicUrl": "https://community.open-ecosystem.com/t/instrument-debug-a-rag-pipeline-adventure-03-intermediate-is-live/936/2" + "topicUrl": "https://community.offon.dev/t/instrument-debug-a-rag-pipeline-adventure-03-intermediate-is-live/936/2" } ], "totalReplies": 4, "solvers": [ { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "solvedAt": "2026-02-21T18:00:30.823Z" }, { "username": "rohit_bc", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/rohit_bc/40/164_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/rohit_bc/40/164_2.png", "solvedAt": "2026-03-03T20:14:12.768Z" } ] diff --git a/src/data/adventures/the-ai-observatory/leaderboard.json b/src/data/adventures/the-ai-observatory/leaderboard.json index a70720cc..018c49bd 100644 --- a/src/data/adventures/the-ai-observatory/leaderboard.json +++ b/src/data/adventures/the-ai-observatory/leaderboard.json @@ -4,7 +4,7 @@ { "rank": 1, "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/90/99.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/90/99.png", "points": 200, "challengesSolved": 2, "beginnerPoints": 100, @@ -16,7 +16,7 @@ { "rank": 2, "username": "rohit_bc", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/rohit_bc/90/164.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/rohit_bc/90/164.png", "points": 120, "challengesSolved": 2, "beginnerPoints": 60, @@ -28,7 +28,7 @@ { "rank": 3, "username": "alvin", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/alvin/90/1.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/alvin/90/1.png", "points": 95, "challengesSolved": 1, "beginnerPoints": 95, @@ -40,7 +40,7 @@ { "rank": 4, "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/90/140.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/90/140.png", "points": 90, "challengesSolved": 1, "beginnerPoints": 90, diff --git a/src/data/community-leaders.json b/src/data/community-leaders.json index dc31f8b9..834707dd 100644 --- a/src/data/community-leaders.json +++ b/src/data/community-leaders.json @@ -7,27 +7,27 @@ "users": [ { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/KatharinaSick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/KatharinaSick/40/9_2.png", "count": 17 }, { "username": "adrianamvillela", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/adrianamvillela/40/46_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/adrianamvillela/40/46_2.png", "count": 14 }, { "username": "DavidHirsch", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/DavidHirsch/40/8_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/DavidHirsch/40/8_2.png", "count": 14 }, { "username": "sinduri", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/sinduri/40/194_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/sinduri/40/194_2.png", "count": 11 }, { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "count": 4 } ] @@ -38,22 +38,22 @@ "users": [ { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "count": 8 }, { "username": "justinrand", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/justinrand/40/140_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/justinrand/40/140_2.png", "count": 6 }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "count": 6 }, { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "count": 4 }, { @@ -69,7 +69,7 @@ "users": [ { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/KatharinaSick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/KatharinaSick/40/9_2.png", "count": 9 } ] @@ -80,7 +80,7 @@ "users": [ { "username": "simon.schrottner", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/simon.schrottner/40/311_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/simon.schrottner/40/311_2.png", "count": 3 } ] @@ -91,27 +91,27 @@ "users": [ { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/KatharinaSick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/KatharinaSick/40/9_2.png", "count": 54 }, { "username": "adrianamvillela", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/adrianamvillela/40/46_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/adrianamvillela/40/46_2.png", "count": 26 }, { "username": "sinduri", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/sinduri/40/194_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/sinduri/40/194_2.png", "count": 21 }, { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "count": 20 }, { "username": "DavidHirsch", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/DavidHirsch/40/8_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/DavidHirsch/40/8_2.png", "count": 17 } ] @@ -122,17 +122,17 @@ "users": [ { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/KatharinaSick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/KatharinaSick/40/9_2.png", "count": 29 }, { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "count": 10 }, { "username": "enri-kapaj", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/enri-kapaj/40/165_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/enri-kapaj/40/165_2.png", "count": 10 }, { @@ -142,7 +142,7 @@ }, { "username": "gsigmund", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/gsigmund/40/99_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/gsigmund/40/99_2.png", "count": 9 } ] @@ -153,27 +153,27 @@ "users": [ { "username": "KatharinaSick", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/KatharinaSick/40/9_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/KatharinaSick/40/9_2.png", "count": 79 }, { "username": "DavidHirsch", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/DavidHirsch/40/8_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/DavidHirsch/40/8_2.png", "count": 44 }, { "username": "theharithsa", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/theharithsa/40/297_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/theharithsa/40/297_2.png", "count": 28 }, { "username": "sinduri", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/sinduri/40/194_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/sinduri/40/194_2.png", "count": 26 }, { "username": "AgataWlodarczyk", - "avatarUrl": "https://community.open-ecosystem.com/user_avatar/community.open-ecosystem.com/AgataWlodarczyk/40/51_2.png", + "avatarUrl": "https://community.offon.dev/user_avatar/community.offon.dev/AgataWlodarczyk/40/51_2.png", "count": 20 } ] diff --git a/src/data/constants.ts b/src/data/constants.ts index 1e2fd9da..25aebd14 100644 --- a/src/data/constants.ts +++ b/src/data/constants.ts @@ -4,7 +4,7 @@ export const BRAND_NAME = "OffOn"; -export const COMMUNITY_URL = "https://community.open-ecosystem.com"; +export const COMMUNITY_URL = "https://community.offon.dev"; export const COMMUNITY_DISPLAY_NAME = "community.offon.dev"; export const CODESPACES_BASE = "https://codespaces.new/dynatrace-oss/open-ecosystem-challenges"; diff --git a/src/root.tsx b/src/root.tsx index 84e33424..a5d97bd2 100644 --- a/src/root.tsx +++ b/src/root.tsx @@ -34,7 +34,7 @@ const webSiteJsonLd = `{"@context":"https://schema.org","@type":"WebSite","name" // sameAs links populate Google's Knowledge Panel. Mirror LINKEDIN_URL, // the Discourse community URL, and the open-ecosystem-challenges GitHub org // from src/data/constants.ts. -const orgJsonLd = `{"@context":"https://schema.org","@type":"Organization","name":"OffOn","url":"https://offon.dev","logo":"https://offon.dev/favicon.png","sameAs":["https://www.linkedin.com/company/open-ecosystem/","https://community.open-ecosystem.com","https://github.com/dynatrace-oss/open-ecosystem-challenges"]}`; +const orgJsonLd = `{"@context":"https://schema.org","@type":"Organization","name":"OffOn","url":"https://offon.dev","logo":"https://offon.dev/favicon.png","sameAs":["https://www.linkedin.com/company/open-ecosystem/","https://community.offon.dev","https://github.com/dynatrace-oss/open-ecosystem-challenges"]}`; export default function Root(): JSX.Element { return ( diff --git a/src/test/consent.test.tsx b/src/test/consent.test.tsx index 56c2d41c..29d72d62 100644 --- a/src/test/consent.test.tsx +++ b/src/test/consent.test.tsx @@ -440,6 +440,25 @@ describe('ConsentBanner - floating button', () => { fireEvent.click(screen.getByRole('button', { name: /change cookie preferences/i })); expect(screen.getByRole('region', { name: 'This site uses analytics cookies' })).toBeTruthy(); }); + + it('moves focus to Decline when the banner reappears after reset', () => { + ls.setItem(CONSENT_STORAGE_KEY, JSON.stringify({ value: 'granted', timestamp: Date.now() })); + renderWithProviders(); + fireEvent.click(screen.getByRole('button', { name: /change cookie preferences/i })); + expect(document.activeElement).toBe(screen.getByRole('button', { name: /decline/i })); + }); +}); + +// --------------------------------------------------------------------------- +// ConsentBanner - focus management +// --------------------------------------------------------------------------- + +describe('ConsentBanner - focus management', () => { + it('does not steal focus from the skip nav on initial page load', () => { + renderWithProviders(); + const declineButton = screen.getByRole('button', { name: /decline/i }); + expect(document.activeElement).not.toBe(declineButton); + }); }); // --------------------------------------------------------------------------- diff --git a/src/test/discussionSection.test.tsx b/src/test/discussionSection.test.tsx index b945ac50..9ad997ab 100644 --- a/src/test/discussionSection.test.tsx +++ b/src/test/discussionSection.test.tsx @@ -19,7 +19,7 @@ const MOCK_POSTS: PostWithAge[] = [ created_at: "2024-06-15T11:15:00Z", age: "45m ago", like_count: 5, - topicUrl: "https://community.open-ecosystem.com/t/topic/42/1", + topicUrl: "https://community.offon.dev/t/topic/42/1", }, { username: "bob", @@ -27,7 +27,7 @@ const MOCK_POSTS: PostWithAge[] = [ created_at: "2024-06-15T09:00:00Z", age: "3h ago", like_count: 0, - topicUrl: "https://community.open-ecosystem.com/t/topic/42/2", + topicUrl: "https://community.offon.dev/t/topic/42/2", }, { username: "carol", @@ -35,7 +35,7 @@ const MOCK_POSTS: PostWithAge[] = [ created_at: "2024-06-13T12:00:00Z", age: "2d ago", like_count: 1, - topicUrl: "https://community.open-ecosystem.com/t/topic/42/3", + topicUrl: "https://community.offon.dev/t/topic/42/3", }, ]; @@ -53,20 +53,20 @@ vi.mock("@/hooks/useDiscussionPosts", () => ({ describe("DiscussionSection - empty state", () => { it("shows 'No community posts yet' when topic has no posts", () => { render( - + ); expect(screen.getByText(/No community posts yet/)).toBeTruthy(); }); it("shows 'Join the discussion' link in the empty state", () => { render( - + ); expect(screen.getByRole("link", { name: /Join the discussion/i })).toBeTruthy(); }); it("shows empty state when adventureId and levelId do not match", () => { - render(); + render(); expect(screen.getByText(/No community posts yet/)).toBeTruthy(); }); }); @@ -78,7 +78,7 @@ describe("DiscussionSection - empty state", () => { describe("DiscussionSection - posts state", () => { it("renders all posts when the hook returns data", () => { render( - + ); expect(screen.getByText("Great challenge!")).toBeTruthy(); expect(screen.getByText("Loved it.")).toBeTruthy(); @@ -87,7 +87,7 @@ describe("DiscussionSection - posts state", () => { it("renders plain text post content (HTML stripped at build time)", () => { render( - + ); expect(screen.getByText("Great challenge!")).toBeTruthy(); expect(screen.getByText("Loved it.")).toBeTruthy(); @@ -95,7 +95,7 @@ describe("DiscussionSection - posts state", () => { it("shows like count for posts with at least one like", () => { render( - + ); expect(screen.getByText("5")).toBeTruthy(); expect(screen.getByText("1")).toBeTruthy(); @@ -103,14 +103,14 @@ describe("DiscussionSection - posts state", () => { it("does not render a like count element for posts with zero likes", () => { render( - + ); expect(screen.queryAllByText("0").length).toBe(0); }); it("renders 'Join the discussion' link when posts are present", () => { render( - + ); expect(screen.getByRole("link", { name: /Join the discussion/i })).toBeTruthy(); }); @@ -123,7 +123,7 @@ describe("DiscussionSection - posts state", () => { describe("DiscussionSection - age display", () => { it("renders age strings returned by the hook", () => { render( - + ); expect(screen.getByText("45m ago")).toBeTruthy(); expect(screen.getByText("3h ago")).toBeTruthy(); diff --git a/src/test/useDiscussionPosts.test.ts b/src/test/useDiscussionPosts.test.ts index 5e3cb2e2..43c9f678 100644 --- a/src/test/useDiscussionPosts.test.ts +++ b/src/test/useDiscussionPosts.test.ts @@ -21,21 +21,21 @@ const MOCK_POSTS = [ cooked: "

Great challenge!

", created_at: "2024-06-15T11:15:00Z", like_count: 5, - topicUrl: "https://community.open-ecosystem.com/t/topic/42/1", + topicUrl: "https://community.offon.dev/t/topic/42/1", }, { username: "bob", cooked: "

Loved it.

", created_at: "2024-06-15T09:00:00Z", like_count: 0, - topicUrl: "https://community.open-ecosystem.com/t/topic/42/2", + topicUrl: "https://community.offon.dev/t/topic/42/2", }, { username: "carol", cooked: "

Well done everyone.

", created_at: "2024-06-13T12:00:00Z", like_count: 1, - topicUrl: "https://community.open-ecosystem.com/t/topic/42/3", + topicUrl: "https://community.offon.dev/t/topic/42/3", }, ]; @@ -143,7 +143,7 @@ describe("useDiscussionPosts - data loading", () => { expect(result.current.posts[0].cooked).toBe("

Great challenge!

"); expect(result.current.posts[0].like_count).toBe(5); expect(result.current.posts[0].topicUrl).toBe( - "https://community.open-ecosystem.com/t/topic/42/1" + "https://community.offon.dev/t/topic/42/1" ); });