R packages, spatial data, maps and open-source projects by dieghernan.
This repository contains the source of One World, my personal blog and portfolio. I share R tutorials, mapping experiments and the tools I build along the way.
The site runs on Jekyll with my Chulapa theme and is hosted on GitHub Pages.
- Blog: R tutorials, package updates and experiments with geographic data.
- Projects: R packages, datasets and other open-source work, including historical Pebble projects.
- Gallery: Maps, plots and Wikimedia contributions.
- About: A little about me and where to find my work.
- Archive: Posts and projects ordered by date.
Featured packages include tidyterra, giscoR, mapSpain and geobounds for spatial data, cffr for software citation and resmush for image optimization.
| Path | Contents |
|---|---|
| index.md | Home page. |
| _pages/ | About, projects, gallery, archives and other site pages. |
| collections/_posts/ | Published blog articles in Markdown. |
| collections/_projects/ | Individual project pages. |
| _Rmd/ | R Markdown sources for tutorials and mapping experiments. |
| _scripts/ | Site-maintenance utilities, project scripts and tests. See the script guide. |
| _includes/ and _layouts/ | Site customizations that extend Chulapa. |
| assets/ | Styles, scripts and other static assets. |
| _config.yml | Jekyll configuration and site settings. |
| llms.txt | A curated guide to the site for language models. |
Use Ruby 3.4, as specified in .ruby-version, and Bundler. The Gemfile specifies Jekyll 4.4 and the site's plugins.
From the repository root:
bundle install
bundle exec jekyll serveOpen localhost:4000 to preview the site. Jekyll downloads the remote Chulapa theme during the build, so an internet connection is required.
To build without starting a server:
bundle exec jekyll buildThe generated site is written to _site/, which is ignored by Git.
The GitHub Actions workflows build the site and deploy it to GitHub Pages when changes are pushed to main. Deployment can also be started manually from the Actions tab.
netlify.toml configures the dhhdevblog site with the same root
directory, _site output, Ruby 3.4, Node.js 22 and Pretty URLs used in its dashboard.
Netlify builds include drafts from collections/_drafts/, including on its
production URL and PR previews. Incremental builds are disabled so cached output
does not retain stale pages. GitHub Pages builds continue to exclude drafts.
Lighthouse and Jekyll Cache remain enabled in the Netlify dashboard, preserving
their installed versions. The dashboard also selects main as the production
branch, disables branch deploys and enables Deploy Previews for PRs against
main. These settings are not changed by the TOML file.
Webmention unit tests run independently of Jekyll.
python -m unittest discover -s _scripts -p test_webmentions.pyThe structured-data workflow builds the site before checking its rendered JSON-LD. To run the same checks locally:
bundle exec jekyll build --config _config.yml,_config_build.yml
python -m unittest discover -s _scripts -p test_structured_data.pyProject JSON-LD summaries follow the original project websites as their source of truth. See the maintenance workflow and source inventory for the fields to update, upstream verification and fallback sources when a project has no equivalent JSON-LD. Synchronization is manual. The checks above validate local output without comparing it with live upstream metadata.
The root llms.txt follows the llms.txt proposal. Jekyll copies it unchanged to /llms.txt, and the deployment workflows include it with the generated site. Update its selected links when the site structure or featured resources change.
The blog's representative h-card supplies its profile to
Bridgy Fed. Edit
indieweb_profile in _config.yml to update it, then refresh the profile
on the Bridgy Fed user page.
The blog uses dieghernan.github.io as its custom Bluesky handle.
.well-known/atproto-did verifies the domain with the blog account's DID,
did:plc:frgeqa77h66m6s4a67pdotgl. Keep the Mastodon bridge on its separate
default handle, dhernangomez.fosstodon.org.ap.brid.gy.
After deploying the verification file, refresh the profile on the Bridgy Fed
user page to apply the custom handle. Bridgy Fed redirects are not configured.
.well-known/site.standard.publication verifies the blog's standard.site
publication by serving its AT URI directly. If Bridgy Fed recreates that
publication record, update this file to match the current record URI.
_data/standard_site_documents.json maps each bridged page's exact URL path
to its site.standard.document AT URI. The custom head include adds a
<link rel="site.standard.document"> only on matching pages. When a new
document is bridged, add its path and URI from the blog's AT Protocol
repository to this map, then rebuild. Keep paths case-sensitive and preserve
trailing slashes. Builds do not query Bridgy Fed.
WebFinger forwarding is not configured: GitHub Pages cannot provide the HTTP redirects with preserved query parameters that Bridgy Fed requires. Jekyll's HTML redirects do not satisfy that requirement. The blog retains its Bridgy Fed address in the fediverse.
Publish through Webmentions sent by the Send outgoing Webmentions workflow
after deployment. The default layout adds a hidden u-bridgy-fed link inside
each article's h-entry, which the sender collects as a publishing target.
Sending a Webmention to Bridgy Fed switches the blog from feed polling to
Webmention-based publishing. RSS and Atom remain available to readers.
Incoming Webmentions remain independent.
When a post also exists on another service, add its actual public permalink (not a profile URL) to the post's frontmatter:
syndication:
- https://social.example/@author/123456
- https://bsky.app/profile/example.com/post/exampleThese are illustrative URLs, not existing copies of this site's posts. Replace
them with the real permalinks before publishing. If the post has an equivalent
.Rmd source, keep its frontmatter synchronized.
The default layout displays an “Also published on” list outside the article's
e-content and inside its h-entry. Each link has u-syndication and
rel="syndication", allowing IndieWeb readers to identify the copies. Only
absolute HTTP(S) links with a hostname are rendered; no section appears when
there are no usable links. No JavaScript, notifications or new service is
required. Publishing to Bridgy Fed uses the separate u-bridgy-fed link.
The independent Send outgoing Webmentions workflow runs after a successful
Pages deployment on main, or manually from Actions. Automatic runs read the
exact deployed HTML artifact. Manual runs build the blog without deploying it.
The sender processes links inside blog posts and project pages' editorial
e-content, excluding navigation and syndicated-copy footers. Project pages
are identified by their /projects/ canonical URL and WebPage structured
data. Each source must match its live public page before sending. Unpublished
edits and stale CDN content remain pending.
The first execution of ledger version 3 rebuilds the earlier baseline and
processes the historical archive, including links previously recorded without
being sent. The previous state.json is preserved as state-before-v3.json
in the webmention-state branch and remains available in Git history. The
migration is checkpointed before delivery and never repeats once version 3 has
been saved. Completed targets are checkpointed atomically, so interrupted runs
resume pending work. Acceptance means the receiver accepted the submission,
not that verification or publication has finished.
Subsequent runs skip unchanged deliveries and retry failed requests. Links
without an endpoint are recorded, too. Edited articles can notify existing
destinations again. Removing links or deleting posts does not send deletion
notifications. For each source and target URL, state.json also retains the
latest outcome (accepted, no_endpoint, retry_source or retry_target);
retry outcomes include the exception type. Keep the state branch: restoring it
from Git preserves delivery history and latest outcomes, whereas losing it
causes the archive to be processed again.
Internal blog links are excluded. Links to /chulapa and /chulapa/ paths on
the same domain are eligible; other same-domain links remain excluded.
The https://fed.brid.gy/ root is allowed as a publishing target. Other
paths and subdomains are excluded as targets; endpoint discovery and
redirects can use the root host, but not its subdomains. Discovery supports
HTTP Link headers and HTML rel="webmention".
The sender pins connections to validated public IPs while retaining the
original hostname for HTTPS certificate checks. It rejects non-public
addresses, configured forward proxies and endpoint POST redirects. No extra
secret or service is needed: GITHUB_TOKEN writes the delivery-state branch.
The independent workflow's failures do not affect the completed deployment.
Inspect its logs for accepted, unsupported and retryable targets. Disabling
this workflow stops outgoing notifications without affecting incoming mentions.
Local checks do not send notifications:
python -m unittest discover -s _scripts -p 'test_*.py'
python _scripts/webmentions.py --site _site --state /tmp/webmention-state.json --dry-runThis repository is distributed under the MIT license.