Skip to content

About

One World: R tutorials, cartography, spatial data and open-source projects by dieghernan. Personal blog and portfolio built with Jekyll and Chulapa.

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Latest commit

 

History

709 Commits

Folders and files

Repository files navigation

One World

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.

Explore the site

  • 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.

Repository structure

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.

Run locally

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 serve

Open 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 build

The generated site is written to _site/, which is ignored by Git.

Deployment

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 previews

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.

Checks

Webmention unit tests run independently of Jekyll.

python -m unittest discover -s _scripts -p test_webmentions.py

The 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.py

Project 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.

Bridgy Fed

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.

Syndicated copies of posts

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/example

These 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.

Outgoing Webmentions

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-run

License

This repository is distributed under the MIT license.

About

One World: R tutorials, cartography, spatial data and open-source projects by dieghernan. Personal blog and portfolio built with Jekyll and Chulapa.

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Sponsor this project

Used by

Contributors

Languages

Generated from dieghernan/chulapa-101