From 6e009a6dd02a999150c411a4da882132702d2b2a Mon Sep 17 00:00:00 2001 From: Roanny Lamas Date: Wed, 14 Oct 2026 16:48:39 -0300 Subject: [PATCH] docs: version the social card's source and its render command og-image-2.jpg was rendered on 2026-10-09 from a hand-written page that lived only in a session scratchpad. .github/og-card/card.html is that page, recovered from the session transcript; its README holds the headless-Chrome and ImageMagick commands, the versions that re-render a byte-identical card (Chrome 155.0.8059.41, ImageMagick 7.1.2-33), and the steps to publish a new card. AGENTS.md and README.md point at it; the README's License keeps the card's personal data unlicensed. Ordered by the operator on 2026-10-14 ("OK, procede!"), as relayed by coabana-workspace. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VfkkCgS1ptZTHK2iWsHgiN --- .github/og-card/README.md | 28 ++++++++++++++++++++++ .github/og-card/card.html | 50 +++++++++++++++++++++++++++++++++++++++ .gitignore | 2 ++ AGENTS.md | 3 ++- README.md | 6 ++--- 5 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 .github/og-card/README.md create mode 100644 .github/og-card/card.html diff --git a/.github/og-card/README.md b/.github/og-card/README.md new file mode 100644 index 0000000..85bc1ed --- /dev/null +++ b/.github/og-card/README.md @@ -0,0 +1,28 @@ +# The social card + +`card.html` is the source of `og-image-2.jpg`, the 1200×630 card that LinkedIn, WhatsApp and X show for https://roanny.github.io/. It is a self-contained page at exactly 1200×630: the site's palette and logo written in place, and the three typefaces loaded from Google Fonts with `display=block`, so the screenshot waits for them. A new card is an edit of this file and a re-render, not a rebuild. + +## Rendering + +From the root of the checkout, with Google Chrome and ImageMagick installed and network access to Google Fonts: + +```bash +cd .github/og-card +"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \ + --headless=new --disable-gpu --hide-scrollbars \ + --virtual-time-budget=8000 --window-size=1200,630 \ + --screenshot="$PWD/card.png" "file://$PWD/card.html" +magick card.png -quality 86 -sampling-factor 4:2:0 -strip card.jpg +magick identify card.jpg # JPEG 1200x630 +``` + +`card.png` and `card.jpg` are ignored by git; the card the site serves is the copy at the root. On 2026-10-14, Google Chrome 155.0.8059.41 and ImageMagick 7.1.2-33 on macOS rendered a `card.jpg` byte-identical to `og-image-2.jpg`. Another version of either, or a change to the fonts Google serves, can move pixels without changing the design. + +## Publishing a new card + +1. Edit `card.html`, render it, and look at `card.jpg`. +2. Copy it to the root under the next filename, `og-image-3.jpg`, and remove the old card: LinkedIn, WhatsApp and X cache a card by its URL, so a new card never reuses a filename. +3. Point the three references in `index.html` at it (`og:image`, `twitter:image`, the JSON-LD `image`), and update the filename in `AGENTS.md`, `README.md` and this file. +4. Once it is live, refetch it in LinkedIn's Post Inspector (https://www.linkedin.com/post-inspector/) with https://roanny.github.io/. + +The card carries the operator's name and profile, which the root `README.md` § License leaves unlicensed, like the page itself. diff --git a/.github/og-card/card.html b/.github/og-card/card.html new file mode 100644 index 0000000..5677f4b --- /dev/null +++ b/.github/og-card/card.html @@ -0,0 +1,50 @@ + + + + + +
+
+
+ + roanny.github.io +
+
DATA ENGINEER · GOOGLE CLOUD CERTIFIED ×2
+

Roanny Lamas López

+

Data Engineer — scalable data ecosystems on Google Cloud

+
BigQueryLookerAirflow / ComposerETL · DWH
+
+ + + + + diff --git a/.gitignore b/.gitignore index b52002d..be82a4c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .claude/settings.local.json .claude/.cc-writes/ .claude/worktrees/ +.github/og-card/card.png +.github/og-card/card.jpg diff --git a/AGENTS.md b/AGENTS.md index b12d6f5..7a31727 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,12 +8,13 @@ The operator's personal CV and portfolio, served at https://roanny.github.io/ by - `404.html` — the themed not-found page, self-contained. - `favicon.svg`, `favicon-32.png`, `og-image-2.jpg` (the 1200×630 social card), `robots.txt`, `sitemap.xml`; `.nojekyll` makes Pages serve the tree as it is. - `.github/scripts/check_site.py`, `.github/htmlvalidate.json` — the site's own gates. +- `.github/og-card/` — `card.html`, the source of the social card, and the command that renders it. ## Previewing and checking - Preview: `python3 -m http.server 8000`, then http://localhost:8000 (`?lang=en|es` and `?theme=light|dark` force the language and the theme). - The gates, as CI runs them: `npx --yes html-validate@11.16.0 --config .github/htmlvalidate.json index.html 404.html`, `python3 .github/scripts/check_site.py i18n`, `python3 .github/scripts/check_site.py sitemap`. -- A content change updates `lastmod` in `sitemap.xml`. A changed social card takes a new filename (`og-image-.jpg`) and the three references in `index.html` (`og:image`, `twitter:image`, the JSON-LD `image`), because LinkedIn, WhatsApp and X cache a card by its URL; LinkedIn's Post Inspector refetches it once it is live. +- A content change updates `lastmod` in `sitemap.xml`. A changed social card is an edit of `.github/og-card/card.html` and a re-render (its `README.md` has the command); it takes a new filename (`og-image-.jpg`) and the three references in `index.html` (`og:image`, `twitter:image`, the JSON-LD `image`), because LinkedIn, WhatsApp and X cache a card by its URL; LinkedIn's Post Inspector refetches it once it is live. CI (`Validate`, `.github/workflows/ci.yml`) refuses invalid HTML in either page, an `i18n` key missing from either language, a malformed sitemap, a changed shared block under `.claude/`, on pull requests a commit subject over 72 characters or with a trailing period, and on pull requests and pushes a commit author other than the one below, Dependabot's or GitHub's own. diff --git a/README.md b/README.md index aa1658e..cb310ba 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ python3 -m http.server 8000 ├── .nojekyll # Pages serves the tree as it is, without Jekyll ├── AGENTS.md # Instructions for coding agents (imported by .claude/CLAUDE.md) ├── LICENSE # Apache-2.0, for the code only (see License) -└── .github/ # Validate (ci.yml), its scripts, Dependabot +└── .github/ # Validate (ci.yml), its scripts, Dependabot, og-card/ (the card's source) ``` ## Editing the text @@ -48,7 +48,7 @@ The site shares its identity with [Coabana](https://coabana.github.io/): the sam ## SEO -`index.html` carries the canonical URL, `hreflang` (`en`, `es` and `x-default` through `?lang=`), Open Graph and Twitter cards with `og-image-2.jpg`, and `Person` JSON-LD (with the Coabana affiliation). After a content change, update `lastmod` in `sitemap.xml`. +`index.html` carries the canonical URL, `hreflang` (`en`, `es` and `x-default` through `?lang=`), Open Graph and Twitter cards with `og-image-2.jpg`, and `Person` JSON-LD (with the Coabana affiliation). The card is rendered from `.github/og-card/card.html`; `.github/og-card/README.md` has the command and the steps to publish a new one. After a content change, update `lastmod` in `sitemap.xml`. ## Development @@ -81,4 +81,4 @@ This site is not part of the Looker Developer Agent and names none of its produc The code — the HTML structure, CSS and JavaScript of `index.html` and `404.html`, and everything under `.github/` and `.claude/` — is licensed under Apache-2.0; see [`LICENSE`](LICENSE). -The personal data and the CV's text are not licensed: the name, contact details, profile, experience, certifications and skills, in the page, in its `i18n` dictionaries, in the structured data and in `og-image-2.jpg`, remain the author's, all rights reserved. The Coabana name and brand, which the page cites, are not licensed either. A fork that reuses the code replaces all of them with its own. +The personal data and the CV's text are not licensed: the name, contact details, profile, experience, certifications and skills, in the page, in its `i18n` dictionaries, in the structured data, in `og-image-2.jpg` and in its source `.github/og-card/card.html`, remain the author's, all rights reserved. The Coabana name and brand, which the page cites, are not licensed either. A fork that reuses the code replaces all of them with its own.