AWS Lambda Php Integration
giuseppe-trisciuoglio/developer-kit
Provides AWS Lambda integration patterns for PHP with Symfony using the Bref framework.
Saga Pattern knowledge base. An agent skill from dykyi-roman/awesome-claude-code.
$ npx skills add dykyi-roman/awesome-claude-code --skill saga-pattern-knowledge -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install dykyi-roman/awesome-claude-code saga-pattern-knowledge --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/dykyi-roman/awesome-claude-code.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/saga-pattern-knowledge .claude/skills/saga-pattern-knowledge && rm -rf skills-srcUse ~/.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/
Install the "saga-pattern-knowledge" agent skill from https://github.com/dykyi-roman/awesome-claude-code/tree/master/skills/saga-pattern-knowledge into .claude/skills/saga-pattern-knowledge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "saga-pattern-knowledge", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/dykyi-roman/awesome-claude-code/tree/master/skills/saga-pattern-knowledgeType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add dykyi-roman/awesome-claude-code --skill saga-pattern-knowledge -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install dykyi-roman/awesome-claude-code saga-pattern-knowledge --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dykyi-roman/awesome-claude-code.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/saga-pattern-knowledge .agents/skills/saga-pattern-knowledge && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "saga-pattern-knowledge" agent skill from https://github.com/dykyi-roman/awesome-claude-code/tree/master/skills/saga-pattern-knowledge into .agents/skills/saga-pattern-knowledge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "saga-pattern-knowledge", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dykyi-roman/awesome-claude-code --skill saga-pattern-knowledge -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install dykyi-roman/awesome-claude-code saga-pattern-knowledge --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dykyi-roman/awesome-claude-code.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/saga-pattern-knowledge .cursor/skills/saga-pattern-knowledge && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "saga-pattern-knowledge" agent skill from https://github.com/dykyi-roman/awesome-claude-code/tree/master/skills/saga-pattern-knowledge into .cursor/skills/saga-pattern-knowledge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "saga-pattern-knowledge", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/dykyi-roman/awesome-claude-code.git --path skills/saga-pattern-knowledge--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add dykyi-roman/awesome-claude-code --skill saga-pattern-knowledge -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install dykyi-roman/awesome-claude-code saga-pattern-knowledge --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dykyi-roman/awesome-claude-code.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/saga-pattern-knowledge .gemini/skills/saga-pattern-knowledge && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "saga-pattern-knowledge" agent skill from https://github.com/dykyi-roman/awesome-claude-code/tree/master/skills/saga-pattern-knowledge into .gemini/skills/saga-pattern-knowledge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "saga-pattern-knowledge", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install dykyi-roman/awesome-claude-code saga-pattern-knowledgeInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add dykyi-roman/awesome-claude-code --skill saga-pattern-knowledge -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/dykyi-roman/awesome-claude-code.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/saga-pattern-knowledge .github/skills/saga-pattern-knowledge && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "saga-pattern-knowledge" agent skill from https://github.com/dykyi-roman/awesome-claude-code/tree/master/skills/saga-pattern-knowledge into .github/skills/saga-pattern-knowledge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "saga-pattern-knowledge", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dykyi-roman/awesome-claude-code --skill saga-pattern-knowledge -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install dykyi-roman/awesome-claude-code saga-pattern-knowledge --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dykyi-roman/awesome-claude-code.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/saga-pattern-knowledge .opencode/skills/saga-pattern-knowledge && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "saga-pattern-knowledge" agent skill from https://github.com/dykyi-roman/awesome-claude-code/tree/master/skills/saga-pattern-knowledge into .opencode/skills/saga-pattern-knowledge/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "saga-pattern-knowledge", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
saga-pattern-knowledgeSaga Pattern knowledge base. An agent skill from dykyi-roman/awesome-claude-code.
Saga Pattern Knowledge is an agent skill from dykyi-roman/awesome-claude-code. Saga Pattern knowledge base. Provides patterns, antipatterns, and PHP-specific guidelines for saga orchestration, choreography, and distributed transaction audits.
Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including reference files and assets (for example `assets/report-template.md`, `references/antipatterns.md` and `references/compensation.md`).
It sits in Backend & APIs, covering Microservices. It works with PHP. The repository describes itself as: PHP Architecture Toolkit for Claude Code (DDD, CQRS, Event Sourcing, Hexagonal, Clean Architecture, SOLID, GRASP, PSR, Design Patterns, Testing, Documentation, Code Review). The licence is MIT.
Read from SKILL.md and the folder at commit 7e1fea8. It shows what the files ask for, not the result of running them.
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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are php and bash).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Saga Pattern Knowledge loads about 3k tokens when it runs, and up to ~17k if it reads all its reference files. Until then it costs about 47 tokens; SKILL.md has 333 words of instructions outside code blocks.
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.
The automated check found no risky patterns in SKILL.md.
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); files beside SKILL.md are not scanned.
The full file from dykyi-roman/awesome-claude-code at commit 7e1fea8, republished under its MIT licence (© dykyi-roman). 333 words, ~3,036 tokens.
.claude/skills/saga-pattern-knowledge/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Quick reference for Saga pattern and PHP implementation guidelines for distributed transactions.
┌─────────────────────────────────────────────────────────────────────────┐
│ SAGA PATTERN │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ CHOREOGRAPHY (Event-driven) │
│ ┌─────────┐ event ┌─────────┐ event ┌─────────┐ │
│ │ Service │───────────▶ │ Service │───────────▶ │ Service │ │
│ │ A │ │ B │ │ C │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │
│ └───────── compensate ──┴─── compensate ────────┘ │
│ │
│ ORCHESTRATION (Central coordinator) │
│ ┌───────────────┐ │
│ │ Saga │ │
│ │ Orchestrator │ │
│ └───────┬───────┘ │
│ ┌─────────────┼─────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Service │ │ Service │ │ Service │ │
│ │ A │ │ B │ │ C │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ Saga = Sequence of local transactions + compensating actions │
│ │
│ T1 → T2 → T3 → ... → Tn │
│ ↓ ↓ ↓ ↓ │
│ C1 C2 C3 Cn │
│ │
│ If Ti fails: execute Ci-1, Ci-2, ..., C1 (reverse order) │
│ │
└─────────────────────────────────────────────────────────────────────────┘| Concept | Description |
|---|---|
| Saga | Sequence of local transactions with compensations |
| Step | Single local transaction within saga |
| Compensating Action | Undoes the effect of a previous step |
| Orchestrator | Central coordinator managing saga execution |
| Choreography | Decentralized, event-driven saga coordination |
| Saga State | Current execution status (enum) |
| Idempotency | Steps can be retried safely |
| Semantic Lock | Prevents concurrent saga conflicts |
| Aspect | Choreography | Orchestration |
|---|---|---|
| Coordination | Decentralized (events) | Centralized (orchestrator) |
| Coupling | Loose | Tighter to orchestrator |
| Visibility | Distributed (hard to trace) | Centralized (easy to monitor) |
| Complexity | Simpler services | Simpler overall flow |
| Testing | Harder (distributed) | Easier (centralized logic) |
| Best for | Simple sagas (2-3 steps) | Complex sagas (4+ steps) |
<?php
declare(strict_types=1);
namespace Domain\Shared\Saga;
enum SagaState: string
{
case Pending = 'pending';
case Running = 'running';
case Compensating = 'compensating';
case Completed = 'completed';
case Failed = 'failed';
case CompensationFailed = 'compensation_failed';
public function canTransitionTo(self $next): bool
{
return match ($this) {
self::Pending => $next === self::Running,
self::Running => in_array($next, [self::Completed, self::Compensating], true),
self::Compensating => in_array($next, [self::Failed, self::CompensationFailed], true),
self::Completed, self::Failed, self::CompensationFailed => false,
};
}
public function isTerminal(): bool
{
return in_array($this, [self::Completed, self::Failed, self::CompensationFailed], true);
}
}<?php
declare(strict_types=1);
namespace Domain\Shared\Saga;
interface SagaStepInterface
{
public function name(): string;
public function execute(SagaContext $context): StepResult;
public function compensate(SagaContext $context): StepResult;
public function isIdempotent(): bool;
}<?php
declare(strict_types=1);
namespace Domain\Shared\Saga;
final class SagaContext
{
/** @var array<string, mixed> */
private array $data = [];
public function __construct(
public readonly string $sagaId,
public readonly string $correlationId,
public readonly \DateTimeImmutable $startedAt
) {}
public function set(string $key, mixed $value): void
{
$this->data[$key] = $value;
}
public function get(string $key, mixed $default = null): mixed
{
return $this->data[$key] ?? $default;
}
public function has(string $key): bool
{
return array_key_exists($key, $this->data);
}
public function all(): array
{
return $this->data;
}
}<?php
declare(strict_types=1);
namespace Application\Shared\Saga;
use Domain\Shared\Saga\SagaContext;
use Domain\Shared\Saga\SagaState;
use Domain\Shared\Saga\SagaStepInterface;
use Domain\Shared\Saga\StepResult;
final class SagaOrchestrator
{
/** @var array<SagaStepInterface> */
private array $steps = [];
/** @var array<string> */
private array $completedSteps = [];
private SagaState $state = SagaState::Pending;
public function __construct(
private readonly SagaContext $context,
private readonly SagaPersistenceInterface $persistence
) {}
public function addStep(SagaStepInterface $step): self
{
$this->steps[] = $step;
return $this;
}
public function execute(): SagaResult
{
$this->state = SagaState::Running;
$this->persistence->save($this->context->sagaId, $this->state, []);
foreach ($this->steps as $step) {
$result = $step->execute($this->context);
if ($result->isFailure()) {
return $this->compensate($step->name(), $result->error());
}
$this->completedSteps[] = $step->name();
$this->persistence->save(
$this->context->sagaId,
$this->state,
$this->completedSteps
);
}
$this->state = SagaState::Completed;
$this->persistence->save($this->context->sagaId, $this->state, $this->completedSteps);
return SagaResult::completed($this->context);
}
private function compensate(string $failedStep, string $error): SagaResult
{
$this->state = SagaState::Compensating;
$this->persistence->save($this->context->sagaId, $this->state, $this->completedSteps);
$stepsToCompensate = array_reverse($this->completedSteps);
foreach ($stepsToCompensate as $stepName) {
$step = $this->findStep($stepName);
$result = $step->compensate($this->context);
if ($result->isFailure()) {
$this->state = SagaState::CompensationFailed;
$this->persistence->save($this->context->sagaId, $this->state, $this->completedSteps);
return SagaResult::compensationFailed($this->context, $error, $result->error());
}
}
$this->state = SagaState::Failed;
$this->persistence->save($this->context->sagaId, $this->state, $this->completedSteps);
return SagaResult::failed($this->context, $error);
}
private function findStep(string $name): SagaStepInterface
{
foreach ($this->steps as $step) {
if ($step->name() === $name) {
return $step;
}
}
throw new \RuntimeException("Step not found: {$name}");
}
}| Violation | Where to Look | Severity |
|---|---|---|
| Missing compensation | Saga step without compensate() | Critical |
| Non-idempotent steps | Retry causes duplicate effects | Critical |
| No saga state persistence | State lost on crash | Critical |
| Synchronous distributed tx | Two-phase commit attempt | Critical |
| Forward-only saga | No compensation at all | Warning |
| Missing correlation ID | Can't trace saga execution | Warning |
| No timeout handling | Saga hangs forever | Warning |
| Compensation order wrong | Not reversed | Warning |
# Find saga implementations
Glob: **/Saga/**/*.php
Glob: **/*Saga.php
Grep: "SagaStep|SagaOrchestrator|Saga.*Interface" --glob "**/*.php"
# Check for saga state management
Grep: "SagaState|saga_state|enum.*Saga" --glob "**/*.php"
# Find compensating actions
Grep: "compensate|compensation|rollback.*step" --glob "**/Saga/**/*.php"
# Detect missing compensations
Grep: "implements.*SagaStep" --glob "**/*.php"
# Then check each for compensate() method
# Find choreography events
Grep: "SagaEvent|SagaCompleted|SagaFailed" --glob "**/Event/**/*.php"
# Check for saga persistence
Grep: "SagaPersistence|SagaRepository|saga.*save" --glob "**/*.php"
# Find potential issues
Grep: "Transaction.*begin.*Transaction" --glob "**/*.php" # Distributed tx attemptOrder Saga: Reserve Inventory → Charge Payment → Ship Order
Step 1: Reserve Inventory
- Action: Decrement stock
- Compensation: Release stock (increment)
Step 2: Charge Payment
- Action: Charge credit card
- Compensation: Refund charge
Step 3: Ship Order
- Action: Create shipment
- Compensation: Cancel shipment
If Step 2 fails:
1. Compensate Step 1 (release inventory)
2. Mark saga as FailedFor detailed information, load these reference files:
references/saga-patterns.md — Choreography and orchestration patternsreferences/compensation.md — Compensating transaction strategiesreferences/antipatterns.md — Common violations with detection patternsreferences/php-specific.md — PHP 8.4 specific implementationsassets/report-template.md — Structured audit report template© dykyi-roman, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (references, assets) in skills/saga-pattern-knowledge of dykyi-roman/awesome-claude-code.
Open the folder on GitHubat commit 7e1fea8
Saga Pattern Knowledge 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Saga Pattern Knowledge this skilldykyi-roman/awesome-claude-code | 103 | — | ~3k | Automated safety check: Pass | MIT | |
| AWS Lambda Php Integrationgiuseppe-trisciuoglio/developer-kit | 355 | — | ~2.3k | Automated safety check: Notes | MIT | |
| Dt Obs ServicesDynatrace/dynatrace-for-ai | 161 | — | ~3.3k | Automated safety check: Pass | Apache-2.0 | |
| Configuring Horizoncoollabsio/coolify | 63k | 4 repos | ~898 | Automated safety check: Pass | MIT | |
| Fortify Developmentcoollabsio/coolify | 63k | 4 repos | ~1.9k | Automated safety check: Pass | MIT | |
| Node Backend Development Guidelinesdiet103/claude-code-infrastructure-showcase | 10k | 2 repos | ~2k | Automated safety check: Pass | MIT |
giuseppe-trisciuoglio/developer-kit
Provides AWS Lambda integration patterns for PHP with Symfony using the Bref framework.
Dynatrace/dynatrace-for-ai
Service performance monitoring with RED metrics (Rate, Errors, Duration) and runtime-specific telemetry for Java, .NET, Node.js, Python, PHP, and Go.
coollabsio/coolify
A skill your agent uses whenever the user mentions Horizon by name in a Laravel context.
coollabsio/coolify
ACTIVATE when the user works on authentication in Laravel. An agent skill from coollabsio/coolify.
diet103/claude-code-infrastructure-showcase
Sets layered architecture and coding rules for Node.js, Express and TypeScript microservices, covering routes, controllers, services, repositories, Prisma, Sentry and Zod.
anonaddy/anonaddy
Apply this skill whenever writing, reviewing, or refactoring Laravel PHP code.
dykyi-roman/awesome-claude-code
GRASP principles knowledge base for PHP 8.4 projects. An agent skill from dykyi-roman/awesome-claude-code.
dykyi-roman/awesome-claude-code
PSR-4 autoloading standard knowledge base for PHP 8.4 projects.
dykyi-roman/awesome-claude-code
PSR-1 and PSR-12 coding standards knowledge base for PHP 8.4 projects.
dykyi-roman/awesome-claude-code
PHP Standards Recommendations (PSR) overview knowledge base.
dykyi-roman/awesome-claude-code
SOLID principles knowledge base for PHP 8.4 projects. An agent skill from dykyi-roman/awesome-claude-code.
dykyi-roman/awesome-claude-code
Comprehensive knowledge base for Claude Code formats, patterns, and configuration.
Works with
Categories
Saga Pattern knowledge base. An agent skill from dykyi-roman/awesome-claude-code. Saga Pattern Knowledge is an agent skill from dykyi-roman/awesome-claude-code. Saga Pattern knowledge base.
Saga Pattern Knowledge fits situations like: tasks that involve Microservices.
Run `npx skills add dykyi-roman/awesome-claude-code --skill saga-pattern-knowledge -a claude-code`. Or copy the skill folder (skills/saga-pattern-knowledge in dykyi-roman/awesome-claude-code) into .claude/skills/saga-pattern-knowledge in your project. Claude Code loads it when a task matches its description.
Run `npx skills add dykyi-roman/awesome-claude-code --skill saga-pattern-knowledge -a codex`. Or copy the skill folder (skills/saga-pattern-knowledge in dykyi-roman/awesome-claude-code) into .agents/skills/saga-pattern-knowledge in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dykyi-roman/awesome-claude-code --skill saga-pattern-knowledge -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/saga-pattern-knowledge, .gemini/skills/saga-pattern-knowledge, .github/skills/saga-pattern-knowledge and .opencode/skills/saga-pattern-knowledge in your project.
SKILL.md names no scripts, command-line tools or credentials: Saga Pattern Knowledge is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Saga Pattern Knowledge is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k tokens (SKILL.md is roughly 12k 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 14k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Saga Pattern Knowledge: AWS Lambda Php Integration (giuseppe-trisciuoglio/developer-kit, 355 stars), Dt Obs Services (Dynatrace/dynatrace-for-ai, 161 stars), Configuring Horizon (coollabsio/coolify, 63k stars) and Fortify Development (coollabsio/coolify, 63k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
dykyi-roman (a GitHub user) maintains it in dykyi-roman/awesome-claude-code, which has 103 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on August 16, 2026.
Source: dykyi-roman/awesome-claude-code on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.