Agent skill

Digitalocean

by ericrisco in ericrisco/rsc-harness

A skill your agent uses when deploying or operating a workload on DigitalOcean — Droplet vs App Platform vs Functions, doctl, app spec YAML, Managed Postgres/MySQL/Valkey on the VPC, S3-compatible…

MITAuto-check: notesDevOps & Cloud

Install Digitalocean

skills CLI
$ npx skills add ericrisco/rsc-harness --skill digitalocean -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ericrisco/rsc-harness digitalocean --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/digitalocean .claude/skills/digitalocean && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
digitalocean
GitHub stars
156
Token cost
~2.8k tokens
SKILL.md length
1,182 words
Files
6 (incl. scripts, references)
Skills in repo
229
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when deploying or operating a workload on DigitalOcean — Droplet vs App Platform vs Functions, doctl, app spec YAML, Managed Postgres/MySQL/Valkey on the VPC, S3-compatible…

  • Operating a workload on DigitalOcean — Droplet vs App Platform vs Functions
  • SKILL.md covers The core decision: Droplet vs…, doctl setup, App Platform via app spec and Droplets, plus 4 more sections
  • Runs Shell scripts from its folder; calls doctl and brew; reaches nyc3.digitaloceanspaces.com; needs API_SIGNING_KEY and SPACES_KEY
  • Managed Postgres/MySQL/Valkey on the VPC

What it does

Digitalocean is an agent skill from ericrisco/rsc-harness. Use when deploying or operating a workload on DigitalOcean — Droplet vs App Platform vs Functions, doctl, app spec YAML, Managed Postgres/MySQL/Valkey on the VPC, S3-compatible Spaces + CDN. NOT host-agnostic CI/CD or rollback strategy (that is deployment), NOT a bare Hetzner VPS (that is hetzner), NOT another managed PaaS (that is railway).

Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/app-spec.md`).

It sits in DevOps & Cloud, covering File uploads and storage and CI/CD. It works with MySQL and PostgreSQL. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.

When your agent uses it

  • Operating a workload on DigitalOcean — Droplet vs App Platform vs Functions
  • Managed Postgres/MySQL/Valkey on the VPC
  • S3-compatible Spaces + CDN

Example prompts

  • “/digitalocean”

Requirements

  • Python 3
  • A Bash shell
  • Docker
  • A credential in API_SIGNING_KEY
  • A credential in SPACES_KEY

What it can do on your machine

Read from SKILL.md and the folder at commit 92fde8f. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/ (Shell), which the agent can run.

    Shell commands in SKILL.md call:

    • doctl
    • brew

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • nyc3.digitaloceanspaces.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • API_SIGNING_KEY
    • SPACES_KEY
    • SPACES_SECRET

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Digitalocean loads about 2.8k tokens when it runs, and up to ~4.7k if it reads all its reference files. Until then it costs about 91 tokens; SKILL.md has 1,182 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~91
When it runs · the whole SKILL.md, loaded when a task matches
~2.8k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~4.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteRuns commands with sudoSKILL.md:52
    #   tar xf doctl-*.tar.gz && sudo mv doctl /usr/local/bin

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from ericrisco/rsc-harness at commit 92fde8f, republished under its MIT licence (© ericrisco). 1,182 words, ~2,840 tokens.

Download SKILL.mdSave it as .claude/skills/digitalocean/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.
name
digitalocean
description
Use when deploying or operating a workload on DigitalOcean — Droplet vs App Platform vs Functions, doctl, app spec YAML, Managed Postgres/MySQL/Valkey on the VPC, S3-compatible Spaces + CDN. NOT host-agnostic CI/CD or rollback strategy (that is `deployment`), NOT a bare Hetzner VPS (that is `hetzner`), NOT another managed PaaS (that is `railway`).
tags
digitalocean, doctl, app-platform, droplets, spaces, deployment, paas, vps
recommends
deployment, postgresdb, docker, domains-dns, monitoring, scaling, hetzner
origin
risco

DigitalOcean — Droplet vs App Platform, doctl, Managed DBs, Spaces

You own one decision: where on DO does this run, and how do I ship it. Host-agnostic CI/CD, release gating and rollback strategy are ../deployment/SKILL.md; authoring the Dockerfile is docker; DNS records and the registrar are domains-dns; a bare Hetzner box and its economics are hetzner. Pick the compute model first, then wire data and storage, then the ops that bite in production.

text
workload → [Droplet | App Platform | Functions] → Managed DB (VPC private host) → Spaces (S3 + CDN)
              raw VPS    managed PaaS   event fn        Postgres/MySQL/Valkey         object store

The core decision: Droplet vs App Platform vs Functions

Settle this before writing a single command. Most web apps want App Platform; reach for a Droplet only when you need the box itself.

AxisDroplet (VPS)App Platform (PaaS)Functions
ControlFull root, any daemon, any portBuild+run only, no SSHPer-invocation, no host
Ops burdenYou patch/secure/restart itDO runs it, auto TLS, auto deployZero infra
Price floorPer-second billing since 2026-01-01, min 60s or $0.013 static sites free; dynamic from $5/mo per servicePay per call
ScalingResize/clone/load-balance yourselfSet instance count + size, autoscaleImplicit
Best forStateful daemons, cron hosts, custom networking, "give me a Linux box"Web service / API / worker / static site from a repoEvent glue, webhooks

Rules of thumb:

  • Stateless web service or API from a Git repo → App Platform. It builds, deploys, gives you TLS and a URL, and re-deploys on push. No box to patch. Static frontend → App Platform static site (free, up to 3); don't run a Droplet to serve HTML.
  • You need root, a long-lived stateful daemon, custom ports, or a cron host → Droplet.
  • A managed Postgres/MySQL/Valkey → always the Managed Database product, never a DB you hand-install on a Droplet, unless you have a hard reason.

doctl setup

doctl is the official DO CLI; it drives everything below.

bash
# macOS
brew install doctl
# Linux: download the release tarball from github.com/digitalocean/doctl/releases, then:
#   tar xf doctl-*.tar.gz && sudo mv doctl /usr/local/bin

# Authenticate with a token from cloud.digitalocean.com/account/api/tokens
doctl auth init                       # pastes a token, validates, stores a context
doctl auth init --context prod        # a named context per account/env
doctl auth switch --context prod      # switch the active context
doctl account get                     # verify the token works

Never commit the token. It is a full-account credential. Keep it in your shell keychain, a secret manager, or CI secret — never in the repo, never in an app spec. Why: a leaked dop_v1_… token lets anyone create/destroy your whole account.

App Platform via app spec

App Platform deploys from an app spec (YAML or JSON). Treat the spec as the source of truth, version it, and apply it with doctl.

yaml
# .do/app.yaml — minimal web service + managed Postgres
name: my-api
region: nyc
services:
  - name: web
    github:
      repo: me/my-api
      branch: main
      deploy_on_push: true
    instance_size_slug: apps-s-1vcpu-1gb   # ~$5/mo basic; sizes go up to dedicated
    instance_count: 1
    http_port: 8080
    envs:
      - key: NODE_ENV
        value: production
        scope: RUN_TIME              # RUN_TIME | BUILD_TIME | RUN_AND_BUILD_TIME
      - key: DATABASE_URL
        value: ${db.DATABASE_URL}    # injected from the managed DB below
        scope: RUN_TIME
      - key: API_SIGNING_KEY
        value: ${API_SIGNING_KEY}
        type: SECRET                 # encrypted at rest; never plaintext
        scope: RUN_TIME
databases:
  - name: db
    engine: PG
    production: true

Lifecycle — validate, then create or update:

bash
doctl apps spec validate .do/app.yaml          # structural lint, no deploy
doctl apps create --spec .do/app.yaml          # first deploy; prints the app id
doctl apps update <app-id> --spec .do/app.yaml # apply changes (and to roll back: re-apply the prior spec)
doctl apps list                                # find the id

Env scoping that matters:

  • type: SECRET encrypts the value at rest and hides it in the dashboard. Use it for every key, token, password. Plain value: is readable.
  • scope: BUILD_TIME for things only the build needs; RUN_TIME for runtime; don't leak build-only secrets into the running container.
  • ${db.DATABASE_URL} (and ${db.HOSTNAME}, ${db.PORT}, etc.) are auto-injected when the service references a databases: entry — you never paste the connection string.

Operate:

bash
doctl apps logs <app-id> --type run --follow     # run | build | deploy
doctl apps logs <app-id> <component> --type run  # one component

Rollback = re-apply the previous spec (git-revert .do/app.yaml and doctl apps update), or redeploy a prior deployment from the dashboard. There is no magic rollback verb — your git history of the spec is the rollback mechanism.

For multi-component apps (web + worker + static_site + job + db, health checks, ingress routes, autoscaling, instance-size table, alerts) see references/app-spec.md.

Droplets

A Droplet is a Linux VPS. Bootstrap it declaratively, lock it down with a cloud firewall.

bash
doctl compute droplet create web-1 \
  --region nyc3 --size s-1vcpu-1gb --image ubuntu-24-04-x64 \
  --ssh-keys <fingerprint> \
  --vpc-uuid <vpc-uuid> \
  --user-data-file cloud-init.yaml \
  --wait
  • Cloud firewall, not just ufw. A cloud firewall filters at DO's edge before traffic reaches the box, and applies to a tag/group of Droplets. Use it as the real perimeter; host ufw is defense-in-depth, not the only line. Why: a misconfigured ufw after a reboot still leaves the edge firewall protecting you.
  • Reserved IP is free while assigned to a Droplet (you pay only when it's unassigned). Assign one so you can re-point it to a replacement Droplet without DNS changes — that's your failover handle.
  • Snapshots/backups are your restore path; enable automated backups or snapshot before risky changes.
  • Per-second billing since 2026-01-01 (min 60s or $0.01): short-lived Droplets are cheap to spin up and destroy, but a powered-off Droplet still bills for storage — destroy, don't just power off, to stop charges.

Cloud-init recipes, firewall inbound/outbound rule sets, snapshot cadence + restore, reserved-IP failover, and the VPC + private-DB layout live in references/droplet-ops.md.

Show full SKILL.md (525 more words)Show less

Managed Databases

Use the Managed Database product for Postgres/MySQL/Valkey — DO handles patching, failover, and backups.

  • Provision sizing: managed Postgres starts ~$15/mo single node; HA (primary+standby) from ~$30/mo; read replicas available for read scaling.
  • Connect over the VPC private host, not the public one. Same-region Droplets and Managed DBs talk over the VPC with no bandwidth charge and sub-ms latency, and the private host keeps the DB off the public internet. Add the app's Droplet/App as a trusted source so only it can connect.
  • Connection pooling (PgBouncer) is built in. Use a pool when many short-lived clients (serverless, lots of App Platform instances) would otherwise exhaust connections — a cluster supports up to ~21 pools / up to ~1,000 connections depending on size, and the pool listens on a separate pool port from the raw DB port. Point your app at the pool connection string, not the raw one.
  • For schema design, indexing, query tuning, migrations → that's ../postgresdb/SKILL.md, not here. This skill only provisions and wires the cluster.

Spaces (S3-compatible object storage + CDN)

Spaces is S3-API-compatible object storage with a built-in CDN.

  • $5/mo includes 250 GiB storage + 1 TiB outbound transfer; inbound is free; the CDN is included at no extra cost across 200+ edge locations.
  • Spaces keys are NOT your API token. Generate a separate Spaces access key + secret; the doctl/API token does not work for S3 operations.
  • Use any S3 SDK or aws-cli/s3cmd against the regional endpoint:
python
# boto3 against DO Spaces (nyc3 region/endpoint)
import boto3
s3 = boto3.client(
    "s3",
    endpoint_url="https://nyc3.digitaloceanspaces.com",
    region_name="nyc3",
    aws_access_key_id="<SPACES_KEY>",       # Spaces key, not the DO API token
    aws_secret_access_key="<SPACES_SECRET>",
)
s3.upload_file("photo.jpg", "my-bucket", "photo.jpg", ExtraArgs={"ACL": "public-read"})

Serve public assets through the bucket's CDN edge URL; set CORS on the bucket if a browser fetches it cross-origin, and a lifecycle rule to expire/transition old objects.

Basic ops + cost gotchas

  • Set alerts on the app/DB (deploy failures, CPU, restart count) so you hear about trouble before users do. App-level dashboards/alerting strategy is ../monitoring.
  • Scale by editing instance_count/instance_size_slug in the spec and re-applying; capacity strategy that's host-agnostic is ../scaling.
  • App Platform data transfer overage is $0.02/GiB, billed separately from Droplet transfer — a chatty media app can run up a bill; front heavy static assets with Spaces+CDN.
  • An unassigned reserved IP is billed. Release reserved IPs you're not using.

Anti-patterns

Anti-patternWhy it bitesDo instead
Hardcoding a dop_v1_… token or DB password as a plain value: in the app specSpec is in git, value is readable, full-account compromisetype: SECRET env, or ${db.*} injection; token only in doctl auth
Connecting app→DB over the public hostPublic exposure + egress cost + latencyVPC private host + trusted source
Running a stateful long-lived daemon as an App Platform serviceComponents are restartable/stateless; state is lostDroplet (or a job/worker designed to be stateless)
Sizing a dedicated apps-d-2vcpu-4gb (~$78/mo) for a hobby appPaying enterprise rates for toy trafficStart apps-s-1vcpu-1gb (~$5) and scale up on real metrics
ufw on the Droplet as the only firewallA bad reboot/config leaves the host openCloud firewall at the edge + host ufw as defense-in-depth
Hand-installing Postgres on a Droplet "to save money"You now own patching, backups, failoverManaged Database unless you have a hard reason
Powering off a Droplet to stop billingPowered-off Droplets still bill for storageSnapshot then destroy
Leaving a reserved IP unassignedIt's billed when not attachedRelease it

© ericrisco, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 5 other files (scripts, references) in skills/digitalocean of ericrisco/rsc-harness.

  • SKILL.md
  • evals/README.md
  • evals/cases.yaml
  • references/app-spec.md
  • references/droplet-ops.md
  • scripts/verify.sh

Open the folder on GitHubat commit 92fde8f

Compare with similar skills

Digitalocean next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Digitalocean compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Digitalocean this skillericrisco/rsc-harness156—~2.8kAutomated safety check: NotesMIT
Database Backupssickn33/agentic-awesome-skills47k2 repos~3.1kAutomated safety check: NotesMIT
Chdb SQLvemetric/vemetric3941 repos~1.2kAutomated safety check: PassApache-2.0
Mfs Findzilliztech/mfs150—~4kAutomated safety check: PassApache-2.0
Mfs Ingestzilliztech/mfs150—~4.7kAutomated safety check: PassApache-2.0
Create Environmentgodatadriven/whirl205—~1.9kAutomated safety check: PassApache-2.0

Similar skills

  • Database Backups

    sickn33/agentic-awesome-skills

    Implement database backup strategies. An agent skill from sickn33/agentic-awesome-skills.

    47k GitHub starsUsed in 2 repos~3.1k tokens
    DatabasesAuto-check: notes
  • Chdb SQL

    vemetric/vemetric

    A skill your agent uses when the user wants to run SQL — especially analytical SQL — on local files (parquet/csv/json), URLs, S3 paths, or remote databases (Postgres, MySQL, MongoDB, ClickHouse…

    394 GitHub starsUsed in 1 repo~1.2k tokens
    DatabasesAuto-check passed
  • Mfs Find

    zilliztech/mfs

    Search, grep, browse, and read across registered MFS data sources via the mfs CLI — codebases, docs, PDFs, web crawls, databases (postgres/mysql/mongo/snowflake/bigquery), issue trackers…

    150 GitHub stars~4k tokensUpdated 2 mo ago
    DatabasesAuto-check passed
  • Mfs Ingest

    zilliztech/mfs

    Register, update, or re-sync data sources for MFS so they become searchable — postgres / mysql / mongo / snowflake / bigquery, github / jira / linear / notion / hubspot / zendesk, slack / discord /…

    150 GitHub stars~4.7k tokensUpdated 2 mo ago
    DatabasesAuto-check passed
  • Create Environment

    godatadriven/whirl

    Create a new Whirl environment in the envs/ directory. An agent skill from godatadriven/whirl.

    205 GitHub stars~1.9k tokensUpdated 5 days ago
    Backend & APIsAuto-check passed
  • Code Patterns

    Aedelon/claude-code-blueprint

    Reference patterns for REST APIs, pytest/vitest testing, Docker multi-stage builds, GitHub Actions CI/CD, PostgreSQL, TypeScript generics, Python async, and React Server Components.

    120 GitHub stars~1.2k tokensUpdated 7 mo ago
    DevOps & CloudAuto-check passed

More from ericrisco/rsc-harness

All 229 skills in this repo
  • Ab Testing

    ericrisco/rsc-harness

    A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…

    156 GitHub stars~2.4k tokensUpdated today
    Auto-check passed
  • Accessibility

    ericrisco/rsc-harness

    A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…

    156 GitHub stars~3.4k tokensUpdated today
    Auto-check passed
  • Ads

    ericrisco/rsc-harness

    A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…

    156 GitHub stars~2.2k tokensUpdated today
    Auto-check passed
  • Agent Eval

    ericrisco/rsc-harness

    A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…

    156 GitHub stars~3.2k tokensUpdated today
    Auto-check passed
  • AI Media

    ericrisco/rsc-harness

    A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…

    156 GitHub stars~3.3k tokensUpdated today
    Auto-check passed
  • Analytics

    ericrisco/rsc-harness

    A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.

    156 GitHub stars~2.8k tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Digitalocean

What does Digitalocean do?

A skill your agent uses when deploying or operating a workload on DigitalOcean — Droplet vs App Platform vs Functions, doctl, app spec YAML, Managed Postgres/MySQL/Valkey on the VPC, S3-compatible…. Digitalocean is an agent skill from ericrisco/rsc-harness. Use when deploying or operating a workload on DigitalOcean — Droplet vs App Platform vs Functions, doctl, app spec YAML, Managed Postgres/MySQL/Valkey on the VPC, S3-compatible Spaces + CDN.

When should I use Digitalocean?

Digitalocean fits situations like: operating a workload on DigitalOcean — Droplet vs App Platform vs Functions; managed Postgres/MySQL/Valkey on the VPC; S3-compatible Spaces + CDN.

How do I install Digitalocean in Claude Code?

Run `npx skills add ericrisco/rsc-harness --skill digitalocean -a claude-code`. Or copy the skill folder (skills/digitalocean in ericrisco/rsc-harness) into .claude/skills/digitalocean in your project. Claude Code loads it when a task matches its description.

How do I install Digitalocean in Codex?

Run `npx skills add ericrisco/rsc-harness --skill digitalocean -a codex`. Or copy the skill folder (skills/digitalocean in ericrisco/rsc-harness) into .agents/skills/digitalocean in your project. Codex loads it when a task matches its description.

Can I use Digitalocean in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ericrisco/rsc-harness --skill digitalocean -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/digitalocean, .gemini/skills/digitalocean, .github/skills/digitalocean and .opencode/skills/digitalocean in your project.

What does Digitalocean need to run?

Going by SKILL.md and its folder, Digitalocean needs a shell for the scripts in its folder, the command-line tools its instructions call (doctl and brew) and credentials named API_SIGNING_KEY, SPACES_KEY and SPACES_SECRET. Our summary lists: Python 3; A Bash shell; Docker; A credential in API_SIGNING_KEY; A credential in SPACES_KEY.

Does Digitalocean access the network?

SKILL.md names 1 domain. In commands or code: nyc3.digitaloceanspaces.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Digitalocean safe to install?

Our automated static check of SKILL.md found notes only (runs commands with sudo), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Digitalocean use?

Digitalocean is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Digitalocean use?

About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.9k tokens, read only when the agent opens those files.

What are the alternatives to Digitalocean?

Skills that share tags, products or a category with Digitalocean: Database Backups (sickn33/agentic-awesome-skills, 47k stars), Chdb SQL (vemetric/vemetric, 394 stars), Mfs Find (zilliztech/mfs, 150 stars) and Mfs Ingest (zilliztech/mfs, 150 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Digitalocean?

ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 156 GitHub stars. The repository holds 229 skills in this directory. The repository was last updated on October 6, 2026.

Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.