Skip to content

feat: initial site — Astro landing (en/ja) + S3/CloudFront deploy notes - #1

Merged
y1o1 merged 6 commits into
mainfrom
feat/initial-site
Jul 17, 2026
Merged

feat: initial site — Astro landing (en/ja) + S3/CloudFront deploy notes#1
y1o1 merged 6 commits into
mainfrom
feat/initial-site

Conversation

@y1o1

@y1o1 y1o1 commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Summary

Public-facing site for the dPLaaX protocol at https://www.dplaax.dev, mirroring the provin.site conventions: Astro 6, Tailwind v4 CSS tokens, typed i18n string tables, doc-only infra/, and a deploy workflow shipped disabled (if: false).

  • Landing page (Hero / boundary commitments / points-vs-line / promises / ecosystem / status) + bilingual 404
  • en is the default locale at / (the spec is en-normative); ja at /ja — the reverse of provin.site, deliberately
  • All copy in src/i18n/ui.ts; ja terminology follows dplaax/spec concept.ja.md (境界の約束事 / 来歴の線 / 真正性と連続性)
  • CloudFront viewer-request function: locale 302, trailing-slash 301, clean-URL → /index.html rewrite, query-string preservation, ?lang= override for the language switch
  • CI: prettier check + astro check + build

The apex is not ours

dplaax.dev (apex) is the protocol namespace publish root owned by dplaax/spec (site/) — frozen wire-identifier documents under /oauth/, /vc/, /schemas/. This repo deploys to www.dplaax.dev only; infra/deploy.md carries the warning (no apex CNAME, no shared bucket, --delete hazard named).

Review

Multi-agent review (Claude reviewer + Codex) ran on the initial scaffold; both converged on the P1: with an OAC private-bucket origin, clean URLs like /ja resolved to a nonexistent S3 key → 404, because the default root object only covers /. Fixed in the second commit along with: query-string-dropping redirects, ja-visitors unable to switch to English, .reveal content hidden without JavaScript, /ja/404 fallback stub leaking into the sitemap, soft-404 risk (response code now pinned in deploy.md, 404 page emits noindex), summary_large_image card with no image, and the .text-fg-strong token being overloaded with gradient paint.

Known deferrals (need design assets, not code): no og:image/social card image, no favicon.ico fallback (SVG favicon only).

Verification

  • npm run build (astro check: 0 errors) and npm run format:check pass
  • astro preview + curl: /, /ja, /404.html, /sitemap-index.xml, /favicon.svg all 200; hreflang alternates reciprocal; sitemap contains exactly / and /ja
  • CloudFront function exercised via a local simulation harness: 13 cases (locale redirect, ?lang= override, slash normalization, index rewrite, asset passthrough, query preservation) — all passing

🤖 Generated with Claude Code

y1o1 and others added 6 commits July 17, 2026 20:24
Public-facing site for the dPLaaX protocol at https://www.dplaax.dev,
mirroring the provin.site conventions (Astro 6, Tailwind v4 tokens,
i18n string tables, doc-only infra, disabled deploy workflow).

Deviations from provin.site, both deliberate:
- en is the default locale (the spec is en-normative); ja lives at /ja
  and the CloudFront locale redirect goes / -> /ja for ja speakers.
- Deploys to www.dplaax.dev ONLY. The apex dplaax.dev is the protocol
  namespace publish root owned by dplaax/spec (frozen wire-identifier
  documents under /oauth/, /vc/, /schemas/) — infra/deploy.md carries
  the warning so a future deploy never syncs over it.

No MDX/content-collection pipeline: all copy lives in src/i18n/ui.ts.
vite is pinned as a devDependency so @tailwindcss/vite and astro
resolve the same vite major (fresh install otherwise splits 7/8 and
fails astro check).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CloudFront function (the P1): an OAC REST origin has no directory-index
concept and the default root object covers only '/', so every clean URL
(/ja) previously 403'd into the 404 page. The function now rewrites
extensionless paths to their /index.html object. Also: redirects
preserve query strings, and an explicit ?lang= switch overrides
Accept-Language negotiation so ja-preferring visitors can actually
reach the English page (LanguageSwitch emits /?lang=en). Function
logic covered by a local simulation harness (13 cases, all passing).

Robustness/SEO cleanups from the same review:
- .reveal hidden state gated behind html.js (content visible without JS)
- sitemap excludes the /ja/404 fallback redirect stub; robots.txt added
- 404 page emits noindex; custom-error response code pinned in deploy.md
- twitter:card downgraded to summary (no og:image shipped)
- .text-gradient carries the gradient paint; text-fg-strong stays a
  plain color token (currentColor consumers no longer vanish)
- vite devDependency pin rationale documented in AGENTS.md
- dead branch in localizedPath removed

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Brand assets from the dPLaaX logo kit (white variants for the dark
theme): public/logo.svg is the full lockup used in Header/Footer in
place of the interim gradient wordmark; the favicon now carries the
official 5-square mark on the site's dark tile instead of the
placeholder dots-and-line glyph.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Per design direction: white base modeled on c2pa.org's surface language —
near-black text matching the logo's #2c2c2c, flat surfaces, thin gray
borders, no gradients — with the official 5-square mark as a faint
background watermark (hero, ~5% on light) and an inverse dark footer
band (white logo, ~8% watermark).

- tokens reworked for light theme + bg/fg-inverse pair for the footer
- gradient heading paint removed entirely (.text-gradient is gone)
- logo split: logo-dark.svg (light surfaces) / logo-white.svg (inverse
  band); favicon unchanged (dark tile reads on any browser tab theme)
- MarkWatermark.astro: currentColor 5-square mark; no negative z-index
  (body background paints over z<0 layers — caught via screenshot)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Align with the provin org's Authors convention (open-protocol posture);
dplaax/spec's LICENSE is updated the same way in its own repo. Only the
Apache-2.0 appendix placeholder line changes — the license body stays
verbatim.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
AWS_PROFILE=<profile> make deploy. Guard rails: AWS_PROFILE required
(no silent default-profile deploys), aws CLI + credential preflight via
sts get-caller-identity, DRY=1 dry-run mode. Sync applies the split
cache-control policy from infra/deploy.md (_astro/ immutable, the rest
max-age=300) and scopes --delete per prefix. Invalidation runs only
when CLOUDFRONT_DISTRIBUTION_ID is provided; skipped with a note
otherwise (the distribution does not exist yet).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@y1o1
y1o1 merged commit 82cfbed into main Jul 17, 2026
1 check passed
@y1o1
y1o1 deleted the feat/initial-site branch July 17, 2026 13:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant