Landing page for the WebtrES Village at Ekoparty, Buenos Aires 2026 — the blockchain hackers community village. A static, bilingual page with the confirmed talk schedule. Built with Astro, styled as a retro terminal.
- Astro 7, static output (no framework integrations, no client-side JS bundle)
- pnpm (Node >= 22.12)
- Styles are inline in
src/layouts/VillageLayout.astro, driven by the design tokens inDESIGN.md
| Command | Action |
|---|---|
pnpm install |
Install dependencies |
pnpm dev |
Dev server at localhost:4321 |
pnpm build |
Build the static site to ./dist/ |
pnpm preview |
Preview the production build locally |
pnpm og |
Regenerate the social card (commit the result) |
src/
├── data/
│ ├── village.ts # locale-independent facts (event, socials)
│ └── schedule.ts # confirmed slots: day, room, time, speaker
├── i18n/
│ ├── ui.ts # every translatable string, keyed per locale
│ └── utils.ts # useTranslations(lang), formatDay, formatDateSpan
├── lib/ics.ts # RFC 5545 builder, America/Argentina/Buenos_Aires
├── layouts/
│ └── VillageLayout.astro # the page itself; takes a `lang` prop
├── og/ # OG card sources: mascot frame + JetBrains Mono
└── pages/
├── index.astro # es — served at /
├── en/index.astro # en — served at /en/
└── calendar/[lang]/[slug].ics.ts # prerendered per-talk and full-agenda calendars
scripts/og-card.mjs # `pnpm og` — renders public/assets/og-card.png
public/assets/ # pixel-art mascot, favicon, generated OG card
public/assets/og-card.png (1200×630) is generated by pnpm og and committed — the
deploy build does not render it, so no fonts or renderer are needed on the build machine.
Re-run pnpm og after editing scripts/og-card.mjs. See AGENTS.md for
details.
site in astro.config.mjs must point at the live origin: og:image, og:url,
canonical, and hreflang are all derived from it, and social scrapers reject relative
URLs.
Spanish is the default locale and is served at /; English lives under /en/.
Locales are declared in astro.config.mjs with prefixDefaultLocale: false.
To add a string, add the key to both locale objects in src/i18n/ui.ts —
the satisfies constraint and the UIKey type will flag a locale that is
missing one. To add a locale, add it to locales in astro.config.mjs, to
languages/ui in ui.ts, to the locale branches in utils.ts, and create
src/pages/<code>/index.astro.
See AGENTS.md for the working notes used by coding agents.
Confirmed talks are split the same way as the rest of the site: the slot
(day, room, clock time, speaker) lives in src/data/schedule.ts, and the
title plus description live in both locales of src/i18n/ui.ts
(talk.<id>.title, talk.<id>.description).
Día 1–3 are 7, 8 and 9 October 2026 at the CEC, Buenos Aires. Times are
America/Argentina/Buenos_Aires (UTC−3, no DST). Each talk has an "add to
calendar" link to /calendar/<lang>/<id>.ics, emitted by astro build —
those files are not committed.
The "add all talks to calendar" button above the agenda downloads
/calendar/<lang>/all.ics: one calendar containing every confirmed talk,
localized to the page language. It shares event IDs with the individual
downloads. Open the file in a calendar app to import the talks; the app may
ask for confirmation. No account or client-side JavaScript is required.