diff --git a/.github/workflows/claude-review.yml b/.github/workflows/claude-review.yml index af30533..a2d2c4a 100644 --- a/.github/workflows/claude-review.yml +++ b/.github/workflows/claude-review.yml @@ -87,7 +87,7 @@ jobs: REPO: ${{ github.repository }} PR: ${{ github.event.pull_request.number }} - This repository (0-draft/on-ramp): Every way from a corporate network into AWS, drawn as a road map: VPN, Direct Connect, SD-WAN, Transit Gateway, Cloud WAN, PrivateLink, hybrid DNS, user access. EN/JA. + This repository (0-draft/aws-connectivity): Every way from a corporate network into AWS, drawn as a road map: VPN, Direct Connect, SD-WAN, Transit Gateway, Cloud WAN, PrivateLink, hybrid DNS, user access. EN/JA. Before reviewing, read whatever this repository says about itself: CLAUDE.md, AGENTS.md, CONTRIBUTING.md, README.md (and README.ja.md if present), and the diff --git a/README.ja.md b/README.ja.md index 05905b3..ec6516b 100644 --- a/README.ja.md +++ b/README.ja.md @@ -1,10 +1,12 @@ -# on-ramp +# aws-connectivity -[![ci](https://github.com/0-draft/on-ramp/actions/workflows/ci.yml/badge.svg)](https://github.com/0-draft/on-ramp/actions/workflows/ci.yml) +[![ci](https://github.com/0-draft/aws-connectivity/actions/workflows/ci.yml/badge.svg)](https://github.com/0-draft/aws-connectivity/actions/workflows/ci.yml) 社内ネットワークから AWS に入るすべての道を、道路地図として描いたインタラクティブ解説 (英語 / 日本語)。インターネット、Site-to-Site VPN、Direct Connect、SD-WAN、AWS 側のハブ (仮想プライベートゲートウェイ、Direct Connect ゲートウェイ、Transit Gateway、Cloud WAN)、PrivateLink、ハイブリッド DNS、人のアクセス、Outposts を 1 枚の地図に載せ、それぞれの道を「AWS がどう動くか予想 → 1 ステップずつ理由を確認」しながら走れます。 -**サイト:** +**サイト:** + +旧名は `0-draft/on-ramp` です (2026-11-08 に改名。旧サイトの URL は表示されなくなりました)。 [English README](README.md) @@ -17,7 +19,7 @@ | 2 | 交通ルール | CIDR スライダー、最長一致の案内標識、BGP、3 つのレイヤー、暗号化がどこに効くか | | 3 | インターネット | パブリックエンドポイントまでの道のり、S3 バケットポリシーのラボ (`aws:SourceIp` と `aws:SourceVpce`) | | 4 | VPN | トンネルのフェイルオーバー、VGW / Transit Gateway / Cloud WAN のスループットラボ (ECMP・大容量トンネル) | -| 5 | Direct Connect | 区間ごとの持ち主、VIF の種類、閉域 ≠ 暗号化。詳細は [Direct Connect 深掘りページ](https://0-draft.github.io/on-ramp/direct-connect/?lang=ja) へ | +| 5 | Direct Connect | 区間ごとの持ち主、VIF の種類、閉域 ≠ 暗号化。詳細は [Direct Connect 深掘りページ](https://0-draft.github.io/aws-connectivity/direct-connect/?lang=ja) へ | | 6 | ハブ | 規模ラボ (VPC × リージョン × 拠点を 4 つの設計で比較、クォータつき)、アプライアンスモード | | 7 | SD-WAN | カプセル化の断面図 (アタッチメントの中の GRE)、Connect の容量ラボ | | 8 | 経路選択 | 同じ経路でもハブが違えば答えが違う: VGW・Transit Gateway・Cloud WAN の判定はしご | @@ -34,7 +36,7 @@ ## Direct Connect 深掘り -地図は「全部の道」、2 ページ目の **[Direct Connect を深掘り](https://0-draft.github.io/on-ramp/direct-connect/?lang=ja)** はそのうち 1 本を部品ごとにたどります。地図の Direct Connect の出口は要約して、そちらにリンクしています。2026-11-08 までは別サイト [0-draft/cross-connect](https://github.com/0-draft/cross-connect) でした。調査ノートは [`docs/direct-connect/`](docs/direct-connect/README.md) にあり、Direct Connect の料金表はサイト全体でここ 1 つだけです (`src/data/dxPricing.ts`、説明は [`docs/direct-connect/10-pricing.md`](docs/direct-connect/10-pricing.md))。 +地図は「全部の道」、2 ページ目の **[Direct Connect を深掘り](https://0-draft.github.io/aws-connectivity/direct-connect/?lang=ja)** はそのうち 1 本を部品ごとにたどります。地図の Direct Connect の出口は要約して、そちらにリンクしています。2026-11-08 までは別サイト [0-draft/cross-connect](https://github.com/0-draft/cross-connect) でした。調査ノートは [`docs/direct-connect/`](docs/direct-connect/README.md) にあり、Direct Connect の料金表はサイト全体でここ 1 つだけです (`src/data/dxPricing.ts`、説明は [`docs/direct-connect/10-pricing.md`](docs/direct-connect/10-pricing.md))。 | セクション | インタラクティブ要素 | | --- | --- | @@ -62,7 +64,7 @@ Node.js 24 が必要です。 ```bash npm ci -npm run dev # http://localhost:5173/on-ramp/ (深掘り: /on-ramp/direct-connect/) +npm run dev # http://localhost:5173/aws-connectivity/ (深掘り: /aws-connectivity/direct-connect/) npm run check # 型チェック・lint・整形・markdownlint・テスト・ビルド npm run test:e2e # 実ブラウザでの確認 (要: npx playwright install chromium) ``` diff --git a/README.md b/README.md index 3a88d35..5dfd966 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ -# on-ramp +# aws-connectivity -[![ci](https://github.com/0-draft/on-ramp/actions/workflows/ci.yml/badge.svg)](https://github.com/0-draft/on-ramp/actions/workflows/ci.yml) +[![ci](https://github.com/0-draft/aws-connectivity/actions/workflows/ci.yml/badge.svg)](https://github.com/0-draft/aws-connectivity/actions/workflows/ci.yml) Every way from a corporate network into AWS, drawn as a road map. A bilingual (English / 日本語) interactive explainer that puts the internet, Site-to-Site VPN, Direct Connect, SD-WAN, the AWS-side hubs (virtual private gateway, Direct Connect gateway, Transit Gateway, Cloud WAN), PrivateLink, hybrid DNS, user access and Outposts on one map, then lets you drive each road: predict what AWS will do, then step through why. -**Site:** ([日本語](https://0-draft.github.io/on-ramp/?lang=ja)) +**Site:** ([日本語](https://0-draft.github.io/aws-connectivity/?lang=ja)) + +Formerly `0-draft/on-ramp` (renamed 2026-11-08; the old site URL no longer serves). [日本語の README](README.ja.md) @@ -17,7 +19,7 @@ Every way from a corporate network into AWS, drawn as a road map. A bilingual (E | 2 | Rules of the road | CIDR slider, longest-prefix gantry signs, BGP, the three layers, where each kind of encryption applies | | 3 | Internet | Hop-by-hop walk to a public endpoint; S3 bucket-policy lab (`aws:SourceIp` vs `aws:SourceVpce`) | | 4 | VPN | Tunnel failover stepper; throughput lab for VGW, Transit Gateway and Cloud WAN (ECMP, large tunnels) | -| 5 | Direct Connect | Who owns which stretch, VIF types, 閉域 ≠ 暗号化 — then deep links into the [Direct Connect deep dive](https://0-draft.github.io/on-ramp/direct-connect/) | +| 5 | Direct Connect | Who owns which stretch, VIF types, 閉域 ≠ 暗号化 — then deep links into the [Direct Connect deep dive](https://0-draft.github.io/aws-connectivity/direct-connect/) | | 6 | Hubs | Scale lab (VPCs × Regions × sites across four designs, with quotas); appliance-mode stepper | | 7 | SD-WAN | Encapsulation cutaway (GRE inside an attachment); Connect capacity lab | | 8 | Path selection | Same routes, three hubs, three answers: VGW vs Transit Gateway vs Cloud WAN decision ladder | @@ -34,7 +36,7 @@ The research behind every number lives in [`docs/`](docs/README.md), with source ## Direct Connect deep dive -The map is every road; the second page, **[Direct Connect, up close](https://0-draft.github.io/on-ramp/direct-connect/)** ([日本語](https://0-draft.github.io/on-ramp/direct-connect/?lang=ja)), drives one of them part by part. The Direct Connect exit on the map summarizes and links there instead of repeating it. It was the separate [0-draft/cross-connect](https://github.com/0-draft/cross-connect) site until 2026-11-08; its research notes are in [`docs/direct-connect/`](docs/direct-connect/README.md), and its Direct Connect price list is now the only one on the site (`src/data/dxPricing.ts`, documented in [`docs/direct-connect/10-pricing.md`](docs/direct-connect/10-pricing.md)). +The map is every road; the second page, **[Direct Connect, up close](https://0-draft.github.io/aws-connectivity/direct-connect/)** ([日本語](https://0-draft.github.io/aws-connectivity/direct-connect/?lang=ja)), drives one of them part by part. The Direct Connect exit on the map summarizes and links there instead of repeating it. It was the separate [0-draft/cross-connect](https://github.com/0-draft/cross-connect) site until 2026-11-08; its research notes are in [`docs/direct-connect/`](docs/direct-connect/README.md), and its Direct Connect price list is now the only one on the site (`src/data/dxPricing.ts`, documented in [`docs/direct-connect/10-pricing.md`](docs/direct-connect/10-pricing.md)). | Section | Interactive part | | --- | --- | @@ -62,7 +64,7 @@ Requires Node.js 24. ```bash npm ci -npm run dev # http://localhost:5173/on-ramp/ (deep dive: /on-ramp/direct-connect/) +npm run dev # http://localhost:5173/aws-connectivity/ (deep dive: /aws-connectivity/direct-connect/) npm run check # typecheck, lint, format, markdownlint, tests, build npm run test:e2e # real-browser checks (needs: npx playwright install chromium) ``` diff --git a/direct-connect/index.html b/direct-connect/index.html index 4cc47c6..92dca44 100644 --- a/direct-connect/index.html +++ b/direct-connect/index.html @@ -3,7 +3,7 @@ - Direct Connect, up close — On-ramp + Direct Connect, up close — AWS Connectivity // Apply a saved theme before first paint so it never flashes. try { - const t = localStorage.getItem("on-ramp:theme"); + const t = localStorage.getItem("aws-connectivity:theme"); if (t === "light" || t === "dark") document.documentElement.dataset.theme = t; } catch {} diff --git a/index.html b/index.html index 522ac81..146d943 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ - On-ramp — every way from your network into AWS + AWS Connectivity — every way from your network into AWS // Apply a saved theme before first paint so it never flashes. try { - const t = localStorage.getItem("on-ramp:theme"); + const t = localStorage.getItem("aws-connectivity:theme"); if (t === "light" || t === "dark") document.documentElement.dataset.theme = t; } catch {} diff --git a/package-lock.json b/package-lock.json index 845a2f4..6ea7a98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "on-ramp", + "name": "aws-connectivity", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "on-ramp", + "name": "aws-connectivity", "version": "0.1.0", "dependencies": { "react": "^19.3.1", diff --git a/package.json b/package.json index 3dc0cc3..7007a8c 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "on-ramp", + "name": "aws-connectivity", "private": true, "version": "0.1.0", "type": "module", diff --git a/playwright.config.ts b/playwright.config.ts index 113f333..e4c1ba5 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -14,7 +14,7 @@ export default defineConfig({ retries: process.env.CI ? 1 : 0, reporter: process.env.CI ? [["github"], ["html", { open: "never" }]] : "list", use: { - baseURL: `http://localhost:${PORT}/on-ramp/`, + baseURL: `http://localhost:${PORT}/aws-connectivity/`, trace: "retain-on-failure", }, projects: [ @@ -29,7 +29,7 @@ export default defineConfig({ ], webServer: { command: `npm run build && npx vite preview --port ${PORT} --strictPort`, - url: `http://localhost:${PORT}/on-ramp/`, + url: `http://localhost:${PORT}/aws-connectivity/`, reuseExistingServer: !process.env.CI, timeout: 120_000, }, diff --git a/src/app/App.test.tsx b/src/app/App.test.tsx index 1af9481..c4fab8b 100644 --- a/src/app/App.test.tsx +++ b/src/app/App.test.tsx @@ -11,7 +11,9 @@ describe("App", () => { , ); - expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("On-ramp"); + expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent( + "AWS Connectivity", + ); // The tail exits load lazily; wait until none is a placeholder. await waitFor( () => expect(container.querySelector("[aria-busy=true]")).toBeNull(), diff --git a/src/app/DirectConnectApp.test.tsx b/src/app/DirectConnectApp.test.tsx index 662c20a..e5e2395 100644 --- a/src/app/DirectConnectApp.test.tsx +++ b/src/app/DirectConnectApp.test.tsx @@ -35,7 +35,7 @@ describe("Direct Connect deep dive", () => { expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent( "Direct Connect を深掘り", ); - expect(localStorage.getItem("on-ramp:lang")).toBe("ja"); + expect(localStorage.getItem("aws-connectivity:lang")).toBe("ja"); }); it("the BGP lab reacts to a failed path", async () => { diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx index 2d3649f..ad26ab8 100644 --- a/src/components/layout/Footer.tsx +++ b/src/components/layout/Footer.tsx @@ -81,12 +81,12 @@ export function Footer({

- - github.com/0-draft/on-ramp + + github.com/0-draft/aws-connectivity {t(C.notes)} diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index 2ec3f4d..b3287f5 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -6,7 +6,7 @@ import { NAV } from "@/data/nav"; export type NavItem = { id: string; label: L }; type Theme = "system" | "light" | "dark"; -const THEME_KEY = "on-ramp:theme"; +const THEME_KEY = "aws-connectivity:theme"; function readTheme(): Theme { try { @@ -193,7 +193,7 @@ export function Header({ - On-ramp + AWS Connectivity {/* Wide screens: every exit, current one centred, edges faded. */} diff --git a/src/components/ui/index.tsx b/src/components/ui/index.tsx index 4974faf..1e33093 100644 --- a/src/components/ui/index.tsx +++ b/src/components/ui/index.tsx @@ -253,7 +253,7 @@ export function Sources({

  • docs/{doc} diff --git a/src/direct-connect.tsx b/src/direct-connect.tsx index 565bb47..92ebcca 100644 --- a/src/direct-connect.tsx +++ b/src/direct-connect.tsx @@ -8,8 +8,8 @@ createRoot(document.getElementById("root")!).render( diff --git a/src/features/direct-connect/components/HomeLink.tsx b/src/features/direct-connect/components/HomeLink.tsx index 918f68a..5073d41 100644 --- a/src/features/direct-connect/components/HomeLink.tsx +++ b/src/features/direct-connect/components/HomeLink.tsx @@ -3,7 +3,7 @@ import { useLang } from "@/i18n/useLang"; import { HOME, pageUrl } from "@/data/site"; /** A link back into the road map that keeps the reader's language. */ -export function OnRampLink({ +export function HomeLink({ section, children, }: { diff --git a/src/features/direct-connect/sections/Gateway.tsx b/src/features/direct-connect/sections/Gateway.tsx index 809cc92..d64dc3d 100644 --- a/src/features/direct-connect/sections/Gateway.tsx +++ b/src/features/direct-connect/sections/Gateway.tsx @@ -3,7 +3,7 @@ import type { L } from "@/i18n/lang"; import { useLang } from "@/i18n/useLang"; import { useNarrow } from "@/hooks/useNarrow"; import { PlainWords } from "../components/Beacon"; -import { OnRampLink } from "../components/HomeLink"; +import { HomeLink } from "../components/HomeLink"; import { Callout, Panel, Scroll, Section, Segmented, T, Tag } from "../components/ui"; import { parseCidr } from "../lib/cidr"; import { type Association, advertised } from "../lib/dxgw"; @@ -709,9 +709,9 @@ export function Gateway() {

    - + - +

    {t(C.prefixLab)}

    diff --git a/src/features/direct-connect/sections/Routing.tsx b/src/features/direct-connect/sections/Routing.tsx index 6748e46..3140c69 100644 --- a/src/features/direct-connect/sections/Routing.tsx +++ b/src/features/direct-connect/sections/Routing.tsx @@ -11,7 +11,7 @@ import { selectPath, } from "../lib/routing"; import { Beacon, PlainWords } from "../components/Beacon"; -import { OnRampLink } from "../components/HomeLink"; +import { HomeLink } from "../components/HomeLink"; const C = { kicker: { en: "BGP & routing", ja: "BGP とルーティング" }, @@ -667,9 +667,9 @@ export function Routing() { - + - + diff --git a/src/features/direct-connect/sections/WhyHard.tsx b/src/features/direct-connect/sections/WhyHard.tsx index fc19004..06cfd7b 100644 --- a/src/features/direct-connect/sections/WhyHard.tsx +++ b/src/features/direct-connect/sections/WhyHard.tsx @@ -6,7 +6,7 @@ import { PlainWords } from "../components/Beacon"; import { Term } from "../components/Term"; import { CAUSE, TRAPS, type Trap } from "../content/traps"; import { NAV } from "../content/nav"; -import { OnRampLink } from "../components/HomeLink"; +import { HomeLink } from "../components/HomeLink"; const C = { kicker: { en: "Start here", ja: "まずはここから" }, @@ -310,9 +310,9 @@ export function WhyHard() {

    - + - +

    diff --git a/src/features/hero/Hero.tsx b/src/features/hero/Hero.tsx index 2514f69..c9e6c65 100644 --- a/src/features/hero/Hero.tsx +++ b/src/features/hero/Hero.tsx @@ -46,8 +46,8 @@ export function Hero() { />
    -

    - On-ramp +

    + AWS Connectivity

    {t({ diff --git a/src/i18n/LangContext.test.tsx b/src/i18n/LangContext.test.tsx index e262810..9e9dae1 100644 --- a/src/i18n/LangContext.test.tsx +++ b/src/i18n/LangContext.test.tsx @@ -12,7 +12,7 @@ function Probe({ onValue }: { onValue: (v: LangValue) => void }) { describe("LangProvider", () => { it("rewrites ?lang= and keeps other params and the hash", () => { - window.history.replaceState(null, "", "/on-ramp/?x=1#routing"); + window.history.replaceState(null, "", "/aws-connectivity/?x=1#routing"); const out: { v?: LangValue } = {}; render( @@ -21,7 +21,7 @@ describe("LangProvider", () => { ); expect(out.v?.lang).toBe("en"); act(() => out.v?.setLang("ja")); - expect(window.location.pathname).toBe("/on-ramp/"); + expect(window.location.pathname).toBe("/aws-connectivity/"); expect(window.location.search).toBe("?x=1&lang=ja"); expect(window.location.hash).toBe("#routing"); expect(document.title).toMatch(/社内/); diff --git a/src/i18n/LangContext.tsx b/src/i18n/LangContext.tsx index 326fe66..a00a65b 100644 --- a/src/i18n/LangContext.tsx +++ b/src/i18n/LangContext.tsx @@ -4,8 +4,8 @@ import { type Lang, readStoredLang, resolveInitialLang, storeLang } from "./lang import { LangContext, type LangValue } from "./context"; const TITLE: Record = { - en: "On-ramp — every way from your network into AWS", - ja: "On-ramp — 社内ネットワークから AWS への全経路", + en: "AWS Connectivity — every way from your network into AWS", + ja: "AWS Connectivity — 社内ネットワークから AWS への全経路", }; export function LangProvider({ diff --git a/src/i18n/lang.ts b/src/i18n/lang.ts index 9313bd2..109237c 100644 --- a/src/i18n/lang.ts +++ b/src/i18n/lang.ts @@ -5,7 +5,7 @@ export type Lang = (typeof LANGS)[number]; export type L = Record; export const DEFAULT_LANG: Lang = "en"; -const STORAGE_KEY = "on-ramp:lang"; +const STORAGE_KEY = "aws-connectivity:lang"; export function isLang(v: unknown): v is Lang { return typeof v === "string" && (LANGS as readonly string[]).includes(v); diff --git a/vite.config.ts b/vite.config.ts index c2067d6..ec38c99 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -4,9 +4,9 @@ import react from "@vitejs/plugin-react"; import tailwindcss from "@tailwindcss/vite"; import { fileURLToPath } from "node:url"; -// Served from https://0-draft.github.io/on-ramp/ on GitHub Pages. +// Served from https://0-draft.github.io/aws-connectivity/ on GitHub Pages. export default defineConfig({ - base: process.env.BASE_PATH ?? "/on-ramp/", + base: process.env.BASE_PATH ?? "/aws-connectivity/", plugins: [react(), tailwindcss()], build: { rolldownOptions: {