From 51c64e055e8340a9995e9427860f9ddee105739c Mon Sep 17 00:00:00 2001 From: Ash Date: Fri, 10 Jul 2026 12:37:55 +0900 Subject: [PATCH 1/3] Reorder community links and add member milestone --- docs/homepage-redesign-roadmap.md | 36 ++++++------- scripts/fetch-meetup-events.mjs | 25 +++++++-- src/components/Hero.astro | 11 ++++ src/data/meetup-events.json | 79 ++++++++++++++++++++++----- src/i18n/ui.ts | 10 ++-- src/lib/meetup-events.ts | 43 ++++++++++++--- src/lib/member-milestone.ts | 15 ++++++ src/pages/index.astro | 89 +++++++++++++++++-------------- test/meetup-event-cache.test.mjs | 48 ++++++++++++++--- test/meetup-events.test.mjs | 14 +++++ test/member-milestone.test.mjs | 19 +++++++ 11 files changed, 299 insertions(+), 90 deletions(-) create mode 100644 src/lib/member-milestone.ts create mode 100644 test/member-milestone.test.mjs diff --git a/docs/homepage-redesign-roadmap.md b/docs/homepage-redesign-roadmap.md index a63bca7..91ec14a 100644 --- a/docs/homepage-redesign-roadmap.md +++ b/docs/homepage-redesign-roadmap.md @@ -1,6 +1,6 @@ # Homepage Redesign Roadmap -Status: Active — PRs 1–4 merged; calendar event details in progress +Status: Active — PRs 1–4 and 4A merged; Community links and page order in progress Primary audience: People considering their first Kyoto Tech Meetup Secondary audience: Existing community members looking for events, venue details, conversations, and member work @@ -8,7 +8,7 @@ Secondary audience: Existing community members looking for events, venue details Redesign the homepage so a first-time visitor can understand the meetup and reach an RSVP as quickly as possible, while preserving the site's role as a useful community resource hub. -The redesign should replace generic, text-heavy marketing sections with concrete information, real community evidence, and direct actions. Existing members should be able to bypass newcomer-oriented content through clear navigation and task-based shortcuts. +The redesign should replace generic, text-heavy marketing sections with concrete information, real community evidence, and direct actions. Existing members should be able to bypass newcomer-oriented content through clear navigation and recognizable links to frequently used resources. ## Audience priority @@ -21,7 +21,7 @@ Prioritizing new visitors does not mean burying member resources. The homepage s ```text Fixed navigation - Next meetup · Calendar · Locations · Community Hub · Language · RSVP + Next meetup · Calendar · Community links · Language · RSVP Event-led hero Clear invitation · Next-event details · Direct RSVP · Community photograph @@ -29,8 +29,8 @@ Event-led hero First-meetup expectations Practical first-visit facts · Secondary RSVP -Community Hub - Events · Discord · Member posts · GitHub · Contact +Community links + Meetup · Discord · GitHub · Contact Upcoming events Mobile event list · Desktop calendar · RSVP counts · Maps links @@ -61,7 +61,7 @@ Final invitation and footer | 3 | Event-led hero | PR 2 | New visitors see and can RSVP for the next event immediately | | 4 | First-meetup onboarding | PR 3 | Generic end-of-page marketing sections are replaced with practical guidance | | 4A | Calendar event details | PR 2 | Calendar events show RSVP counts and direct Maps links without a separate locations section | -| 5 | Community Hub and page order | PRs 1 and 4 | Returning members have task-based shortcuts and the page has a coherent narrative | +| 5 | Community links and page order | PRs 1 and 4 | Returning members have fast access to frequently used resources and the page has a coherent narrative | | 6 | Responsive events | PRs 2, 4A, and 5 | Mobile event discovery becomes easier and lighter | | 7 | Member feed refinement | PR 5 | Member work becomes authentic community evidence rather than a long set of carousels | | 8 | Accessibility, performance, analytics, and final QA | PRs 3–7 | The complete journey is verified and measurable | @@ -322,33 +322,31 @@ Make each calendar event more useful at a glance and consolidate venue discovery --- -## PR 5: Community Hub and page order +## PR 5: Community links and page order ### Objective -Give existing members fast, task-oriented access to resources without interrupting the newcomer joining path. +Give existing members fast access to frequently used resources without interrupting the newcomer joining path. ### Scope - Move the current quick links below the first-meetup onboarding section. -- Rename the section to “Community Hub.” -- Mix internal destination links with external community services. +- Rename the section to “Community links.” +- Preserve the four existing external destinations: Meetup, Discord, GitHub, and Contact. - Reorder the remainder of the homepage according to the target structure. - Add a fixed-navigation destination for the hub. - Restore a compact community-size signal near the hub introduction, backed by Meetup data rather than a hard-coded claim. -### Suggested shortcuts +### Resource links -- Upcoming events → `#calendar` +- Meetup → community Meetup group - Discord → community Discord -- Member posts → `#community-feed` - GitHub → community GitHub organization -- Contact organizers → contact form +- Contact → organizer contact form ### Implementation notes - Rename `#quick-links` to `#community-hub` in `src/pages/index.astro`. -- Update the link data to describe tasks rather than repeat service names alone. - Show external-link indicators only for external destinations. - Keep the link cards concise; one label and, at most, one short supporting line. - Update header anchors and localized navigation strings. @@ -360,12 +358,12 @@ Give existing members fast, task-oriented access to resources without interrupti - Preserve the last valid member count when Meetup is unavailable or the count cannot be parsed; a count failure must not discard otherwise valid event data. - Convert the exact count to a conservative public milestone by rounding down to the nearest 25. For example, counts from 225 through 249 render as “225+ members and growing.” - Do not render the module when there is no valid cached count or the rounded milestone is below 25. -- Keep the module out of the event-led hero. Place it as concise community-level social proof near the Community Hub introduction. +- Place the module in the event-led hero as concise community-level social proof, using a neutral translucent treatment rather than an alert color. - Add aligned English and Japanese strings, and keep formatting in a small tested helper rather than embedding rounding logic in the template. ### Acceptance criteria -- A returning visitor can reach every core resource from either the header or Community Hub. +- A returning visitor can reach every core resource from either the header or Community links. - The newcomer path remains hero → expectations → RSVP before the resource hub begins. - Internal and external destinations are visually distinguishable without excessive decoration. - Mobile navigation exposes the same essential destinations as desktop navigation. @@ -565,7 +563,7 @@ These decisions should not block PR 1 or PR 2, but they must be resolved before - A member login or private portal - Machine translation of member-authored posts - Replacing Meetup as the RSVP system -- Splitting the Community Hub into a separate route before the resource set requires it +- Splitting Community links into a separate route before the resource set requires it ## Definition of success @@ -573,7 +571,7 @@ The redesign is successful when: - A new visitor can identify and reach the next meetup's RSVP from the first viewport. - First-time concerns are answered with concise, factual guidance instead of generic marketing copy. -- Returning members can reach core resources directly from navigation or the Community Hub. +- Returning members can reach core resources directly from navigation or Community links. - The mobile event experience does not depend on horizontal calendar scrolling. - Real event imagery and member work provide the page's primary social proof. - Both locale routes respect explicit visitor choice. diff --git a/scripts/fetch-meetup-events.mjs b/scripts/fetch-meetup-events.mjs index 1762fbe..8c299c2 100644 --- a/scripts/fetch-meetup-events.mjs +++ b/scripts/fetch-meetup-events.mjs @@ -4,7 +4,7 @@ import { fileURLToPath } from "node:url"; import { DEFAULT_MEETUP_EVENTS_URL, DEFAULT_MEETUP_TIMEOUT_MS, - fetchMeetupEvents, + fetchMeetupSnapshot, isMeetupEvent, } from "../src/lib/meetup-events.ts"; @@ -57,6 +57,13 @@ export function isValidMeetupEventCache(value) { ) { return false; } + if ( + value.memberCount !== undefined && + value.memberCount !== null && + (!Number.isInteger(value.memberCount) || value.memberCount < 0) + ) { + return false; + } return value.events.every(isMeetupEvent); } @@ -79,7 +86,7 @@ async function writeMeetupEventCache(outputPath, payload) { export async function refreshMeetupEventCache({ eventsUrl = DEFAULT_EVENTS_URL, - fetchEventsFn = fetchMeetupEvents, + fetchSnapshotFn = fetchMeetupSnapshot, logger = console, now = new Date(), outputPath = DEFAULT_OUTPUT_PATH, @@ -87,9 +94,21 @@ export async function refreshMeetupEventCache({ timeoutMs = DEFAULT_TIMEOUT_MS, } = {}) { try { - const events = await fetchEventsFn({ eventsUrl, now, timeoutMs }); + const snapshot = await fetchSnapshotFn({ eventsUrl, now, timeoutMs }); + const events = snapshot?.events; + if (!Array.isArray(events) || !events.every(isMeetupEvent)) { + throw new Error("Meetup response did not contain valid event data."); + } + + const parsedMemberCount = snapshot?.memberCount; + const existing = await readMeetupEventCache(outputPath); + const memberCount = + Number.isInteger(parsedMemberCount) && parsedMemberCount >= 0 + ? parsedMemberCount + : (existing?.memberCount ?? null); const payload = { generatedAt: now.toISOString(), + memberCount, events, }; diff --git a/src/components/Hero.astro b/src/components/Hero.astro index edc6ccd..1c555fc 100644 --- a/src/components/Hero.astro +++ b/src/components/Hero.astro @@ -1,5 +1,6 @@ --- import type { MeetupEvent } from "../lib/meetup-events"; +import { FaUserGroup } from "react-icons/fa6"; import NextEventCard from "./NextEventCard.astro"; type Props = { @@ -9,6 +10,7 @@ type Props = { imageAlt: string; imageSrc: string; lang?: "en" | "ja"; + memberMilestoneLabel?: string | null; now?: Date; primaryCtaLabel: string; secondaryCtaLabel: string; @@ -23,6 +25,7 @@ const { imageAlt, imageSrc, lang = "en", + memberMilestoneLabel = null, now = new Date(), primaryCtaLabel, secondaryCtaLabel, @@ -62,6 +65,14 @@ const primaryCtaUrl = event?.link ?? fallbackUrl;

{subtitle}

+ { + memberMilestoneLabel ? ( +

+

+ ) : null + }
diff --git a/src/data/meetup-events.json b/src/data/meetup-events.json index e8b1260..7e21d49 100644 --- a/src/data/meetup-events.json +++ b/src/data/meetup-events.json @@ -1,5 +1,6 @@ { - "generatedAt": "2026-07-09T22:31:59.420Z", + "generatedAt": "2026-07-10T03:28:38.734Z", + "memberCount": 214, "events": [ { "title": "Morning Tech & Coffee", @@ -8,7 +9,7 @@ "endTime": "2026-07-18T10:30:00+09:00", "description": "\\(English follows Japanese \\| 英語以下\\)\n\n朝をコーヒーと会話、そして京都のテックコミュニティで始めませんか?\n\nこのミートアップはリラックスした雰囲気で、アジェンダのない集まりです。出勤前にちょっとつながって、少しのインスピレーションを得る場としてどうぞ。コーディング、デザイン、ハードウェア制作、あるいは好奇心を持っている方でも大歓迎です。\n\n**ミートアップについて**\n\n* **アジェンダなし**: トーク、プレゼン、売り込みはありません。ものづくりについて自由に語り合いましょう。\n* **出入り自由**: 開始や終了の時間はきっちり決まっていません。遅れて来ても、早めに帰っても大丈夫。自分のスケジュールに合わせてどうぞ。\n* **多言語歓迎**: 日本語と英語OK。他の言語も歓迎ですが、主催者は話せないかもしれません!\n* **旅行者も歓迎**: 観光や出張で京都に来ている方も気軽にご参加ください。\n\n**会話のきっかけ(例)**\n– 今取り組んでいることは?\n– 最近学んでいる技術は?\n– 誰かの助けや後押しが必要?\n– ただコーヒー片手に雑談したい?\n\n☕ 会場のカフェにご配慮ください。ドリンクを注文し、スタッフに感謝し、心地よい環境を一緒に保ちましょう。\n\n気軽に立ち寄って、声をかけて、一日のスタートを一緒に切りましょう!\n\n**主催者について**\n[Ash Ryan Arnwine](https://www.ashryan.io/about/) が主催しています。長年にわたり、ビルダーとして、またコミュニティのオーガナイザーとして活動しています。\n\n===\n\nKick off your morning with coffee, conversation, and Kyoto’s tech community.\n\nThis is a relaxed, agenda-free meetup—just a reason to connect and maybe find a little inspiration before heading off to work. Whether you’re coding, designing, building hardware, or simply curious, you’re welcome here.\n\n**About the meetup**\n– **No agenda**: No talks, no presentations, no pitches. Just builders and makers chatting about building and making.\n– **Come-and-go format**: No hard start or stop time. Show up late or leave early—do what works for your schedule.\n– **Multilingual**: Japanese and English welcome. Other languages too (I just can’t speak them!).\n– **Traveler-friendly**: Whether you’re on vacation or in town for work, you’re welcome.\n\n**Some conversation starters**\n– What are you working on?\n– What new tech are you exploring?\n– Need help or accountability?\n– Or just want to swap stories over coffee?\n\n☕ Please support our host café: buy a drink, thank the staff, keep the space friendly, and remain mindful we’re in a shared environment.\n\nDrop in, say hi, and kick off your day with us!\n\n**About the organizer**\nHosted by [Ash Ryan Arnwine](https://www.ashryan.io/about/), longtime builder and community organizer.", "image": "https://secure.meetupstatic.com/photos/event/3/d/8/5/highres_532455749.jpeg", - "goingCount": 1, + "goingCount": 4, "interestedCount": 30, "venue": { "name": "スターバックス烏丸四条店", @@ -21,13 +22,13 @@ }, { "title": "Morning Tech & Coffee", - "link": "https://www.meetup.com/kyoto-tech-meetup/events/rgkfztyjckbfc/", + "link": "https://www.meetup.com/kyoto-tech-meetup/events/cszgztyjckbfc/", "start": "2026-07-23T08:30:00+09:00", "endTime": "2026-07-23T09:30:00+09:00", "description": "\\(English follows Japanese \\| 英語以下\\)\n\n朝をコーヒーと会話、そして京都のテックコミュニティで始めませんか?\n\nこのミートアップはリラックスした雰囲気で、アジェンダのない集まりです。出勤前にちょっとつながって、少しのインスピレーションを得る場としてどうぞ。コーディング、デザイン、ハードウェア制作、あるいは好奇心を持っている方でも大歓迎です。\n\n**ミートアップについて**\n\n* **アジェンダなし**: トーク、プレゼン、売り込みはありません。ものづくりについて自由に語り合いましょう。\n* **出入り自由**: 開始や終了の時間はきっちり決まっていません。遅れて来ても、早めに帰っても大丈夫。自分のスケジュールに合わせてどうぞ。\n* **多言語歓迎**: 日本語と英語OK。他の言語も歓迎ですが、主催者は話せないかもしれません!\n* **旅行者も歓迎**: 観光や出張で京都に来ている方も気軽にご参加ください。\n\n**会話のきっかけ(例)**\n– 今取り組んでいることは?\n– 最近学んでいる技術は?\n– 誰かの助けや後押しが必要?\n– ただコーヒー片手に雑談したい?\n\n☕ 会場のカフェにご配慮ください。ドリンクを注文し、スタッフに感謝し、心地よい環境を一緒に保ちましょう。\n\n気軽に立ち寄って、声をかけて、一日のスタートを一緒に切りましょう!\n\n**主催者について**\n[Ash Ryan Arnwine](https://www.ashryan.io/about/) が主催しています。長年にわたり、ビルダーとして、またコミュニティのオーガナイザーとして活動しています。\n\n===\n\nKick off your morning with coffee, conversation, and Kyoto’s tech community.\n\nThis is a relaxed, agenda-free meetup—just a reason to connect and maybe find a little inspiration before heading off to work. Whether you’re coding, designing, building hardware, or simply curious, you’re welcome here.\n\n**About the meetup**\n– **No agenda**: No talks, no presentations, no pitches. Just builders and makers chatting about building and making.\n– **Come-and-go format**: No hard start or stop time. Show up late or leave early—do what works for your schedule.\n– **Multilingual**: Japanese and English welcome. Other languages too (I just can’t speak them!).\n– **Traveler-friendly**: Whether you’re on vacation or in town for work, you’re welcome.\n\n**Some conversation starters**\n– What are you working on?\n– What new tech are you exploring?\n– Need help or accountability?\n– Or just want to swap stories over coffee?\n\n☕ Please support our host café: buy a drink, thank the staff, keep the space friendly, and remain mindful we’re in a shared environment.\n\nDrop in, say hi, and kick off your day with us!\n\n**About the organizer**\nHosted by [Ash Ryan Arnwine](https://www.ashryan.io/about/), longtime builder and community organizer.Thu", "image": "https://secure.meetupstatic.com/photos/event/3/d/8/5/highres_532455749.jpeg", - "goingCount": 1, - "interestedCount": 32, + "goingCount": 3, + "interestedCount": 26, "venue": { "name": "スターバックス烏丸四条店", "address": "600-8009 京都府 京都市下京区 四条通室町東入函谷鉾町101 アーバンネット四条烏丸ビル", @@ -62,7 +63,7 @@ "endTime": "2026-08-01T10:30:00+09:00", "description": "\\(English follows Japanese \\| 英語以下\\)\n\n朝をコーヒーと会話、そして京都のテックコミュニティで始めませんか?\n\nこのミートアップはリラックスした雰囲気で、アジェンダのない集まりです。出勤前にちょっとつながって、少しのインスピレーションを得る場としてどうぞ。コーディング、デザイン、ハードウェア制作、あるいは好奇心を持っている方でも大歓迎です。\n\n**ミートアップについて**\n\n* **アジェンダなし**: トーク、プレゼン、売り込みはありません。ものづくりについて自由に語り合いましょう。\n* **出入り自由**: 開始や終了の時間はきっちり決まっていません。遅れて来ても、早めに帰っても大丈夫。自分のスケジュールに合わせてどうぞ。\n* **多言語歓迎**: 日本語と英語OK。他の言語も歓迎ですが、主催者は話せないかもしれません!\n* **旅行者も歓迎**: 観光や出張で京都に来ている方も気軽にご参加ください。\n\n**会話のきっかけ(例)**\n– 今取り組んでいることは?\n– 最近学んでいる技術は?\n– 誰かの助けや後押しが必要?\n– ただコーヒー片手に雑談したい?\n\n☕ 会場のカフェにご配慮ください。ドリンクを注文し、スタッフに感謝し、心地よい環境を一緒に保ちましょう。\n\n気軽に立ち寄って、声をかけて、一日のスタートを一緒に切りましょう!\n\n**主催者について**\n[Ash Ryan Arnwine](https://www.ashryan.io/about/) が主催しています。長年にわたり、ビルダーとして、またコミュニティのオーガナイザーとして活動しています。\n\n===\n\nKick off your morning with coffee, conversation, and Kyoto’s tech community.\n\nThis is a relaxed, agenda-free meetup—just a reason to connect and maybe find a little inspiration before heading off to work. Whether you’re coding, designing, building hardware, or simply curious, you’re welcome here.\n\n**About the meetup**\n– **No agenda**: No talks, no presentations, no pitches. Just builders and makers chatting about building and making.\n– **Come-and-go format**: No hard start or stop time. Show up late or leave early—do what works for your schedule.\n– **Multilingual**: Japanese and English welcome. Other languages too (I just can’t speak them!).\n– **Traveler-friendly**: Whether you’re on vacation or in town for work, you’re welcome.\n\n**Some conversation starters**\n– What are you working on?\n– What new tech are you exploring?\n– Need help or accountability?\n– Or just want to swap stories over coffee?\n\n☕ Please support our host café: buy a drink, thank the staff, keep the space friendly, and remain mindful we’re in a shared environment.\n\nDrop in, say hi, and kick off your day with us!\n\n**About the organizer**\nHosted by [Ash Ryan Arnwine](https://www.ashryan.io/about/), longtime builder and community organizer.", "image": "https://secure.meetupstatic.com/photos/event/3/d/8/5/highres_532455749.jpeg", - "goingCount": 4, + "goingCount": 6, "interestedCount": 25, "venue": { "name": "スターバックス烏丸四条店", @@ -75,13 +76,49 @@ }, { "title": "Morning Tech & Coffee", - "link": "https://www.meetup.com/kyoto-tech-meetup/events/qrsgztyjclbtb/", + "link": "https://www.meetup.com/kyoto-tech-meetup/events/qqxgztyjclbjb/", + "start": "2026-08-06T08:30:00+09:00", + "endTime": "2026-08-06T09:30:00+09:00", + "description": "\\(English follows Japanese \\| 英語以下\\)\n\n朝をコーヒーと会話、そして京都のテックコミュニティで始めませんか?\n\nこのミートアップはリラックスした雰囲気で、アジェンダのない集まりです。出勤前にちょっとつながって、少しのインスピレーションを得る場としてどうぞ。コーディング、デザイン、ハードウェア制作、あるいは好奇心を持っている方でも大歓迎です。\n\n**ミートアップについて**\n\n* **アジェンダなし**: トーク、プレゼン、売り込みはありません。ものづくりについて自由に語り合いましょう。\n* **出入り自由**: 開始や終了の時間はきっちり決まっていません。遅れて来ても、早めに帰っても大丈夫。自分のスケジュールに合わせてどうぞ。\n* **多言語歓迎**: 日本語と英語OK。他の言語も歓迎ですが、主催者は話せないかもしれません!\n* **旅行者も歓迎**: 観光や出張で京都に来ている方も気軽にご参加ください。\n\n**会話のきっかけ(例)**\n– 今取り組んでいることは?\n– 最近学んでいる技術は?\n– 誰かの助けや後押しが必要?\n– ただコーヒー片手に雑談したい?\n\n☕ 会場のカフェにご配慮ください。ドリンクを注文し、スタッフに感謝し、心地よい環境を一緒に保ちましょう。\n\n気軽に立ち寄って、声をかけて、一日のスタートを一緒に切りましょう!\n\n**主催者について**\n[Ash Ryan Arnwine](https://www.ashryan.io/about/) が主催しています。長年にわたり、ビルダーとして、またコミュニティのオーガナイザーとして活動しています。\n\n===\n\nKick off your morning with coffee, conversation, and Kyoto’s tech community.\n\nThis is a relaxed, agenda-free meetup—just a reason to connect and maybe find a little inspiration before heading off to work. Whether you’re coding, designing, building hardware, or simply curious, you’re welcome here.\n\n**About the meetup**\n– **No agenda**: No talks, no presentations, no pitches. Just builders and makers chatting about building and making.\n– **Come-and-go format**: No hard start or stop time. Show up late or leave early—do what works for your schedule.\n– **Multilingual**: Japanese and English welcome. Other languages too (I just can’t speak them!).\n– **Traveler-friendly**: Whether you’re on vacation or in town for work, you’re welcome.\n\n**Some conversation starters**\n– What are you working on?\n– What new tech are you exploring?\n– Need help or accountability?\n– Or just want to swap stories over coffee?\n\n☕ Please support our host café: buy a drink, thank the staff, keep the space friendly, and remain mindful we’re in a shared environment.\n\nDrop in, say hi, and kick off your day with us!\n\n**About the organizer**\nHosted by [Ash Ryan Arnwine](https://www.ashryan.io/about/), longtime builder and community organizer.Thu", + "image": "https://secure.meetupstatic.com/photos/event/3/d/8/5/highres_532455749.jpeg", + "goingCount": 3, + "interestedCount": 36, + "venue": { + "name": "スターバックス烏丸四条店", + "address": "600-8009 京都府 京都市下京区 四条通室町東入函谷鉾町101 アーバンネット四条烏丸ビル", + "city": "Kyoto", + "state": "", + "country": "JP" + }, + "eventType": "coffee" + }, + { + "title": "Morning Tech & Coffee", + "link": "https://www.meetup.com/kyoto-tech-meetup/events/wnzgztyjclbtb/", "start": "2026-08-15T09:30:00+09:00", "endTime": "2026-08-15T10:30:00+09:00", "description": "\\(English follows Japanese \\| 英語以下\\)\n\n朝をコーヒーと会話、そして京都のテックコミュニティで始めませんか?\n\nこのミートアップはリラックスした雰囲気で、アジェンダのない集まりです。出勤前にちょっとつながって、少しのインスピレーションを得る場としてどうぞ。コーディング、デザイン、ハードウェア制作、あるいは好奇心を持っている方でも大歓迎です。\n\n**ミートアップについて**\n\n* **アジェンダなし**: トーク、プレゼン、売り込みはありません。ものづくりについて自由に語り合いましょう。\n* **出入り自由**: 開始や終了の時間はきっちり決まっていません。遅れて来ても、早めに帰っても大丈夫。自分のスケジュールに合わせてどうぞ。\n* **多言語歓迎**: 日本語と英語OK。他の言語も歓迎ですが、主催者は話せないかもしれません!\n* **旅行者も歓迎**: 観光や出張で京都に来ている方も気軽にご参加ください。\n\n**会話のきっかけ(例)**\n– 今取り組んでいることは?\n– 最近学んでいる技術は?\n– 誰かの助けや後押しが必要?\n– ただコーヒー片手に雑談したい?\n\n☕ 会場のカフェにご配慮ください。ドリンクを注文し、スタッフに感謝し、心地よい環境を一緒に保ちましょう。\n\n気軽に立ち寄って、声をかけて、一日のスタートを一緒に切りましょう!\n\n**主催者について**\n[Ash Ryan Arnwine](https://www.ashryan.io/about/) が主催しています。長年にわたり、ビルダーとして、またコミュニティのオーガナイザーとして活動しています。\n\n===\n\nKick off your morning with coffee, conversation, and Kyoto’s tech community.\n\nThis is a relaxed, agenda-free meetup—just a reason to connect and maybe find a little inspiration before heading off to work. Whether you’re coding, designing, building hardware, or simply curious, you’re welcome here.\n\n**About the meetup**\n– **No agenda**: No talks, no presentations, no pitches. Just builders and makers chatting about building and making.\n– **Come-and-go format**: No hard start or stop time. Show up late or leave early—do what works for your schedule.\n– **Multilingual**: Japanese and English welcome. Other languages too (I just can’t speak them!).\n– **Traveler-friendly**: Whether you’re on vacation or in town for work, you’re welcome.\n\n**Some conversation starters**\n– What are you working on?\n– What new tech are you exploring?\n– Need help or accountability?\n– Or just want to swap stories over coffee?\n\n☕ Please support our host café: buy a drink, thank the staff, keep the space friendly, and remain mindful we’re in a shared environment.\n\nDrop in, say hi, and kick off your day with us!\n\n**About the organizer**\nHosted by [Ash Ryan Arnwine](https://www.ashryan.io/about/), longtime builder and community organizer.", "image": "https://secure.meetupstatic.com/photos/event/3/d/8/5/highres_532455749.jpeg", - "goingCount": 1, - "interestedCount": 44, + "goingCount": 3, + "interestedCount": 34, + "venue": { + "name": "スターバックス烏丸四条店", + "address": "600-8009 京都府 京都市下京区 四条通室町東入函谷鉾町101 アーバンネット四条烏丸ビル", + "city": "Kyoto", + "state": "", + "country": "JP" + }, + "eventType": "coffee" + }, + { + "title": "Morning Tech & Coffee", + "link": "https://www.meetup.com/kyoto-tech-meetup/events/qqxgztyjclbbc/", + "start": "2026-08-20T08:30:00+09:00", + "endTime": "2026-08-20T09:30:00+09:00", + "description": "\\(English follows Japanese \\| 英語以下\\)\n\n朝をコーヒーと会話、そして京都のテックコミュニティで始めませんか?\n\nこのミートアップはリラックスした雰囲気で、アジェンダのない集まりです。出勤前にちょっとつながって、少しのインスピレーションを得る場としてどうぞ。コーディング、デザイン、ハードウェア制作、あるいは好奇心を持っている方でも大歓迎です。\n\n**ミートアップについて**\n\n* **アジェンダなし**: トーク、プレゼン、売り込みはありません。ものづくりについて自由に語り合いましょう。\n* **出入り自由**: 開始や終了の時間はきっちり決まっていません。遅れて来ても、早めに帰っても大丈夫。自分のスケジュールに合わせてどうぞ。\n* **多言語歓迎**: 日本語と英語OK。他の言語も歓迎ですが、主催者は話せないかもしれません!\n* **旅行者も歓迎**: 観光や出張で京都に来ている方も気軽にご参加ください。\n\n**会話のきっかけ(例)**\n– 今取り組んでいることは?\n– 最近学んでいる技術は?\n– 誰かの助けや後押しが必要?\n– ただコーヒー片手に雑談したい?\n\n☕ 会場のカフェにご配慮ください。ドリンクを注文し、スタッフに感謝し、心地よい環境を一緒に保ちましょう。\n\n気軽に立ち寄って、声をかけて、一日のスタートを一緒に切りましょう!\n\n**主催者について**\n[Ash Ryan Arnwine](https://www.ashryan.io/about/) が主催しています。長年にわたり、ビルダーとして、またコミュニティのオーガナイザーとして活動しています。\n\n===\n\nKick off your morning with coffee, conversation, and Kyoto’s tech community.\n\nThis is a relaxed, agenda-free meetup—just a reason to connect and maybe find a little inspiration before heading off to work. Whether you’re coding, designing, building hardware, or simply curious, you’re welcome here.\n\n**About the meetup**\n– **No agenda**: No talks, no presentations, no pitches. Just builders and makers chatting about building and making.\n– **Come-and-go format**: No hard start or stop time. Show up late or leave early—do what works for your schedule.\n– **Multilingual**: Japanese and English welcome. Other languages too (I just can’t speak them!).\n– **Traveler-friendly**: Whether you’re on vacation or in town for work, you’re welcome.\n\n**Some conversation starters**\n– What are you working on?\n– What new tech are you exploring?\n– Need help or accountability?\n– Or just want to swap stories over coffee?\n\n☕ Please support our host café: buy a drink, thank the staff, keep the space friendly, and remain mindful we’re in a shared environment.\n\nDrop in, say hi, and kick off your day with us!\n\n**About the organizer**\nHosted by [Ash Ryan Arnwine](https://www.ashryan.io/about/), longtime builder and community organizer.Thu", + "image": "https://secure.meetupstatic.com/photos/event/3/d/8/5/highres_532455749.jpeg", + "goingCount": 3, + "interestedCount": 36, "venue": { "name": "スターバックス烏丸四条店", "address": "600-8009 京都府 京都市下京区 四条通室町東入函谷鉾町101 アーバンネット四条烏丸ビル", @@ -93,13 +130,31 @@ }, { "title": "Morning Tech & Coffee", - "link": "https://www.meetup.com/kyoto-tech-meetup/events/qrsgztyjclbmc/", + "link": "https://www.meetup.com/kyoto-tech-meetup/events/wnzgztyjclbmc/", "start": "2026-08-29T09:30:00+09:00", "endTime": "2026-08-29T10:30:00+09:00", "description": "\\(English follows Japanese \\| 英語以下\\)\n\n朝をコーヒーと会話、そして京都のテックコミュニティで始めませんか?\n\nこのミートアップはリラックスした雰囲気で、アジェンダのない集まりです。出勤前にちょっとつながって、少しのインスピレーションを得る場としてどうぞ。コーディング、デザイン、ハードウェア制作、あるいは好奇心を持っている方でも大歓迎です。\n\n**ミートアップについて**\n\n* **アジェンダなし**: トーク、プレゼン、売り込みはありません。ものづくりについて自由に語り合いましょう。\n* **出入り自由**: 開始や終了の時間はきっちり決まっていません。遅れて来ても、早めに帰っても大丈夫。自分のスケジュールに合わせてどうぞ。\n* **多言語歓迎**: 日本語と英語OK。他の言語も歓迎ですが、主催者は話せないかもしれません!\n* **旅行者も歓迎**: 観光や出張で京都に来ている方も気軽にご参加ください。\n\n**会話のきっかけ(例)**\n– 今取り組んでいることは?\n– 最近学んでいる技術は?\n– 誰かの助けや後押しが必要?\n– ただコーヒー片手に雑談したい?\n\n☕ 会場のカフェにご配慮ください。ドリンクを注文し、スタッフに感謝し、心地よい環境を一緒に保ちましょう。\n\n気軽に立ち寄って、声をかけて、一日のスタートを一緒に切りましょう!\n\n**主催者について**\n[Ash Ryan Arnwine](https://www.ashryan.io/about/) が主催しています。長年にわたり、ビルダーとして、またコミュニティのオーガナイザーとして活動しています。\n\n===\n\nKick off your morning with coffee, conversation, and Kyoto’s tech community.\n\nThis is a relaxed, agenda-free meetup—just a reason to connect and maybe find a little inspiration before heading off to work. Whether you’re coding, designing, building hardware, or simply curious, you’re welcome here.\n\n**About the meetup**\n– **No agenda**: No talks, no presentations, no pitches. Just builders and makers chatting about building and making.\n– **Come-and-go format**: No hard start or stop time. Show up late or leave early—do what works for your schedule.\n– **Multilingual**: Japanese and English welcome. Other languages too (I just can’t speak them!).\n– **Traveler-friendly**: Whether you’re on vacation or in town for work, you’re welcome.\n\n**Some conversation starters**\n– What are you working on?\n– What new tech are you exploring?\n– Need help or accountability?\n– Or just want to swap stories over coffee?\n\n☕ Please support our host café: buy a drink, thank the staff, keep the space friendly, and remain mindful we’re in a shared environment.\n\nDrop in, say hi, and kick off your day with us!\n\n**About the organizer**\nHosted by [Ash Ryan Arnwine](https://www.ashryan.io/about/), longtime builder and community organizer.", "image": "https://secure.meetupstatic.com/photos/event/3/d/8/5/highres_532455749.jpeg", - "goingCount": 1, - "interestedCount": 44, + "goingCount": 3, + "interestedCount": 34, + "venue": { + "name": "スターバックス烏丸四条店", + "address": "600-8009 京都府 京都市下京区 四条通室町東入函谷鉾町101 アーバンネット四条烏丸ビル", + "city": "Kyoto", + "state": "", + "country": "JP" + }, + "eventType": "coffee" + }, + { + "title": "Morning Tech & Coffee", + "link": "https://www.meetup.com/kyoto-tech-meetup/events/qqxgztyjcmbfb/", + "start": "2026-09-03T08:30:00+09:00", + "endTime": "2026-09-03T09:30:00+09:00", + "description": "\\(English follows Japanese \\| 英語以下\\)\n\n朝をコーヒーと会話、そして京都のテックコミュニティで始めませんか?\n\nこのミートアップはリラックスした雰囲気で、アジェンダのない集まりです。出勤前にちょっとつながって、少しのインスピレーションを得る場としてどうぞ。コーディング、デザイン、ハードウェア制作、あるいは好奇心を持っている方でも大歓迎です。\n\n**ミートアップについて**\n\n* **アジェンダなし**: トーク、プレゼン、売り込みはありません。ものづくりについて自由に語り合いましょう。\n* **出入り自由**: 開始や終了の時間はきっちり決まっていません。遅れて来ても、早めに帰っても大丈夫。自分のスケジュールに合わせてどうぞ。\n* **多言語歓迎**: 日本語と英語OK。他の言語も歓迎ですが、主催者は話せないかもしれません!\n* **旅行者も歓迎**: 観光や出張で京都に来ている方も気軽にご参加ください。\n\n**会話のきっかけ(例)**\n– 今取り組んでいることは?\n– 最近学んでいる技術は?\n– 誰かの助けや後押しが必要?\n– ただコーヒー片手に雑談したい?\n\n☕ 会場のカフェにご配慮ください。ドリンクを注文し、スタッフに感謝し、心地よい環境を一緒に保ちましょう。\n\n気軽に立ち寄って、声をかけて、一日のスタートを一緒に切りましょう!\n\n**主催者について**\n[Ash Ryan Arnwine](https://www.ashryan.io/about/) が主催しています。長年にわたり、ビルダーとして、またコミュニティのオーガナイザーとして活動しています。\n\n===\n\nKick off your morning with coffee, conversation, and Kyoto’s tech community.\n\nThis is a relaxed, agenda-free meetup—just a reason to connect and maybe find a little inspiration before heading off to work. Whether you’re coding, designing, building hardware, or simply curious, you’re welcome here.\n\n**About the meetup**\n– **No agenda**: No talks, no presentations, no pitches. Just builders and makers chatting about building and making.\n– **Come-and-go format**: No hard start or stop time. Show up late or leave early—do what works for your schedule.\n– **Multilingual**: Japanese and English welcome. Other languages too (I just can’t speak them!).\n– **Traveler-friendly**: Whether you’re on vacation or in town for work, you’re welcome.\n\n**Some conversation starters**\n– What are you working on?\n– What new tech are you exploring?\n– Need help or accountability?\n– Or just want to swap stories over coffee?\n\n☕ Please support our host café: buy a drink, thank the staff, keep the space friendly, and remain mindful we’re in a shared environment.\n\nDrop in, say hi, and kick off your day with us!\n\n**About the organizer**\nHosted by [Ash Ryan Arnwine](https://www.ashryan.io/about/), longtime builder and community organizer.Thu", + "image": "https://secure.meetupstatic.com/photos/event/3/d/8/5/highres_532455749.jpeg", + "goingCount": 3, + "interestedCount": 36, "venue": { "name": "スターバックス烏丸四条店", "address": "600-8009 京都府 京都市下京区 四条通室町東入函谷鉾町101 アーバンネット四条烏丸ビル", diff --git a/src/i18n/ui.ts b/src/i18n/ui.ts index 34c672e..8b05f5c 100644 --- a/src/i18n/ui.ts +++ b/src/i18n/ui.ts @@ -37,9 +37,10 @@ export const ui = { "nav.meetup": "Meetup", "nav.eventsShort": "Events", "nav.calendar": "Calendar", - "nav.communityHub": "Community Hub", + "nav.communityHub": "Community links", - "home.quickLinks.title": "Connect with the community", + "home.quickLinks.title": "Community links", + "home.quickLinks.memberMilestone": "{count}+ members and growing", "home.quickLinks.meetup.title": "Meetup", "home.quickLinks.meetup.description": "Hang with us", "home.quickLinks.discord.title": "Discord", @@ -138,9 +139,10 @@ export const ui = { "nav.meetup": "Meetup", "nav.eventsShort": "イベント", "nav.calendar": "カレンダー", - "nav.communityHub": "コミュニティハブ", + "nav.communityHub": "コミュニティリンク", - "home.quickLinks.title": "コミュニティとつながる", + "home.quickLinks.title": "コミュニティリンク", + "home.quickLinks.memberMilestone": "メンバー{count}人以上、さらに増えています", "home.quickLinks.meetup.title": "Meetup", "home.quickLinks.meetup.description": "次回イベントに参加する。", "home.quickLinks.discord.title": "Discord", diff --git a/src/lib/meetup-events.ts b/src/lib/meetup-events.ts index ba00989..085cfa5 100644 --- a/src/lib/meetup-events.ts +++ b/src/lib/meetup-events.ts @@ -31,6 +31,11 @@ export type MeetupEvent = { } | null; }; +type MeetupSnapshot = { + events: MeetupEvent[]; + memberCount: number | null; +}; + export function buildMeetupVenueMapsUrl( venue: MeetupEvent["venue"], ): string | null { @@ -128,7 +133,7 @@ function compareMeetupEvents(a: MeetupEvent, b: MeetupEvent): number { return linkDifference !== 0 ? linkDifference : a.title.localeCompare(b.title); } -export function parseMeetupEventsHtml(html: string): MeetupEvent[] { +export function parseMeetupSnapshotHtml(html: string): MeetupSnapshot { const match = html.match( /