Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/claude-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 8 additions & 6 deletions README.ja.md
Original file line number Diff line number Diff line change
@@ -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 ステップずつ理由を確認」しながら走れます。

**サイト:** <https://0-draft.github.io/on-ramp/?lang=ja>
**サイト:** <https://0-draft.github.io/aws-connectivity/?lang=ja>

旧名は `0-draft/on-ramp` です (2026-11-08 に改名。旧サイトの URL は表示されなくなりました)。

[English README](README.md)

Expand All @@ -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 の判定はしご |
Expand All @@ -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))。

| セクション | インタラクティブ要素 |
| --- | --- |
Expand Down Expand Up @@ -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)
```
Expand Down
14 changes: 8 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -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/> ([日本語](https://0-draft.github.io/on-ramp/?lang=ja))
**Site:** <https://0-draft.github.io/aws-connectivity/> ([日本語](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)

Expand All @@ -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 |
Expand All @@ -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 |
| --- | --- |
Expand Down Expand Up @@ -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)
```
Expand Down
4 changes: 2 additions & 2 deletions direct-connect/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Direct Connect, up close — On-ramp</title>
<title>Direct Connect, up close — AWS Connectivity</title>
<meta
name="description"
content="AWS Direct Connect in depth: connections, LAG and MACsec, virtual interfaces, Direct Connect gateway, BGP, resiliency, security, operations and pricing, each with a lab. Bilingual (EN/JA)."
Expand All @@ -12,7 +12,7 @@
<script>
// 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 {}
</script>
Expand Down
4 changes: 2 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>On-ramp — every way from your network into AWS</title>
<title>AWS Connectivity — every way from your network into AWS</title>
<meta
name="description"
content="Every network path between a corporate network and AWS, drawn as a road map: Site-to-Site VPN, Direct Connect, SD-WAN, Transit Gateway and Cloud WAN, PrivateLink, hybrid DNS, Client VPN, Verified Access and the internet. Bilingual (EN/JA)."
Expand All @@ -12,7 +12,7 @@
<script>
// 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 {}
</script>
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "on-ramp",
"name": "aws-connectivity",
"private": true,
"version": "0.1.0",
"type": "module",
Expand Down
4 changes: 2 additions & 2 deletions playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: [
Expand All @@ -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,
},
Expand Down
4 changes: 3 additions & 1 deletion src/app/App.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ describe("App", () => {
<App />
</LangProvider>,
);
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(),
Expand Down
2 changes: 1 addition & 1 deletion src/app/DirectConnectApp.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 () => {
Expand Down
6 changes: 3 additions & 3 deletions src/components/layout/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,12 @@ export function Footer({
</li>
</ul>
<p className="mt-2 flex flex-wrap gap-4 text-xs">
<a className="underline" href="https://github.com/0-draft/on-ramp">
github.com/0-draft/on-ramp
<a className="underline" href="https://github.com/0-draft/aws-connectivity">
github.com/0-draft/aws-connectivity
</a>
<a
className="underline"
href="https://github.com/0-draft/on-ramp/tree/main/docs"
href="https://github.com/0-draft/aws-connectivity/tree/main/docs"
>
{t(C.notes)}
</a>
Expand Down
6 changes: 3 additions & 3 deletions src/components/layout/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -193,7 +193,7 @@ export function Header({
<a
href={back ? back.href : "#top"}
className="flex min-h-10 shrink-0 items-center gap-1.5 font-black tracking-tight"
aria-label={back ? `On-ramp: ${t(back.label)}` : "On-ramp"}
aria-label={back ? `AWS Connectivity: ${t(back.label)}` : "AWS Connectivity"}
title={back ? t(back.label) : undefined}
>
<svg viewBox="0 0 64 64" className="h-6 w-6" aria-hidden="true">
Expand All @@ -213,7 +213,7 @@ export function Header({
strokeLinejoin="round"
/>
</svg>
<span className="hidden sm:inline">On-ramp</span>
<span className="hidden sm:inline">AWS Connectivity</span>
</a>

{/* Wide screens: every exit, current one centred, edges faded. */}
Expand Down
2 changes: 1 addition & 1 deletion src/components/ui/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ export function Sources({
<li>
<a
className="underline"
href={`https://github.com/0-draft/on-ramp/blob/main/docs/${doc}`}
href={`https://github.com/0-draft/aws-connectivity/blob/main/docs/${doc}`}
>
docs/{doc}
</a>
Expand Down
4 changes: 2 additions & 2 deletions src/direct-connect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ createRoot(document.getElementById("root")!).render(
<StrictMode>
<LangProvider
title={{
en: "Direct Connect, up close — On-ramp",
ja: "Direct Connect を深掘り — On-ramp",
en: "Direct Connect, up close — AWS Connectivity",
ja: "Direct Connect を深掘り — AWS Connectivity",
}}
>
<DirectConnectApp />
Expand Down
2 changes: 1 addition & 1 deletion src/features/direct-connect/components/HomeLink.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}: {
Expand Down
6 changes: 3 additions & 3 deletions src/features/direct-connect/sections/Gateway.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -709,9 +709,9 @@ export function Gateway() {
</Panel>
<p className="mt-4 max-w-3xl text-sm leading-relaxed text-[var(--muted)]">
<T c={C.hubs} />
<OnRampLink section="hubs">
<HomeLink section="hubs">
<T c={C.hubsLink} />
</OnRampLink>
</HomeLink>
</p>

<h3 className="mt-14 mb-2 text-xl font-extrabold">{t(C.prefixLab)}</h3>
Expand Down
6 changes: 3 additions & 3 deletions src/features/direct-connect/sections/Routing.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 とルーティング" },
Expand Down Expand Up @@ -667,9 +667,9 @@ export function Routing() {
<T c={C.med} />
<span className="mt-2 block">
<T c={C.hubChoice} />
<OnRampLink section="routing">
<HomeLink section="routing">
<T c={C.hubChoiceLink} />
</OnRampLink>
</HomeLink>
</span>
</Callout>
</div>
Expand Down
6 changes: 3 additions & 3 deletions src/features/direct-connect/sections/WhyHard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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: "まずはここから" },
Expand Down Expand Up @@ -310,9 +310,9 @@ export function WhyHard() {
</div>
<p className="mb-8 max-w-3xl text-sm leading-relaxed text-[var(--muted)]">
<T c={C.roads} />
<OnRampLink>
<HomeLink>
<T c={{ en: "the road map", ja: "道路地図" }} />
</OnRampLink>
</HomeLink>
<T c={C.roadsEnd} />
</p>
<Causes onPick={pick} />
Expand Down
4 changes: 2 additions & 2 deletions src/features/hero/Hero.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ export function Hero() {
/>
</svg>
<div className="min-w-0">
<h1 className="text-5xl leading-none font-black tracking-tight sm:text-6xl">
On-ramp
<h1 className="text-4xl leading-none font-black tracking-tight sm:text-6xl">
AWS Connectivity
</h1>
<p className="phrase mt-2 text-lg font-semibold [text-wrap:balance] sm:text-xl">
{t({
Expand Down
4 changes: 2 additions & 2 deletions src/i18n/LangContext.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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(
<LangProvider>
Expand All @@ -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(/社内/);
Expand Down
4 changes: 2 additions & 2 deletions src/i18n/LangContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import { type Lang, readStoredLang, resolveInitialLang, storeLang } from "./lang
import { LangContext, type LangValue } from "./context";

const TITLE: Record<Lang, string> = {
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({
Expand Down
Loading
Loading