Elasticsearch Audit
aspectrr/deer
Enable, configure, and query Elasticsearch security audit logs.
Domain-specific: SAP Commerce, OpenSearch detection, WordPress validation, enterprise search.
$ npx skills add notque/vexjoy-agent --skill domain -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install notque/vexjoy-agent domain --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/notque/vexjoy-agent.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/domain/domain .claude/skills/domain && 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 "domain" agent skill from https://github.com/notque/vexjoy-agent/tree/main/skills/domain/domain into .claude/skills/domain/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "domain", 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/notque/vexjoy-agent/tree/main/skills/domain/domainType 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 notque/vexjoy-agent --skill domain -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install notque/vexjoy-agent domain --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/notque/vexjoy-agent.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/domain/domain .agents/skills/domain && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "domain" agent skill from https://github.com/notque/vexjoy-agent/tree/main/skills/domain/domain into .agents/skills/domain/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "domain", 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 notque/vexjoy-agent --skill domain -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install notque/vexjoy-agent domain --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/notque/vexjoy-agent.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/domain/domain .cursor/skills/domain && 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 "domain" agent skill from https://github.com/notque/vexjoy-agent/tree/main/skills/domain/domain into .cursor/skills/domain/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "domain", 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/notque/vexjoy-agent.git --path skills/domain/domain--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 notque/vexjoy-agent --skill domain -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install notque/vexjoy-agent domain --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/notque/vexjoy-agent.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/domain/domain .gemini/skills/domain && 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 "domain" agent skill from https://github.com/notque/vexjoy-agent/tree/main/skills/domain/domain into .gemini/skills/domain/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "domain", 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 notque/vexjoy-agent domainInstalls 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 notque/vexjoy-agent --skill domain -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/notque/vexjoy-agent.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/domain/domain .github/skills/domain && 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 "domain" agent skill from https://github.com/notque/vexjoy-agent/tree/main/skills/domain/domain into .github/skills/domain/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "domain", 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 notque/vexjoy-agent --skill domain -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install notque/vexjoy-agent domain --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/notque/vexjoy-agent.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/domain/domain .opencode/skills/domain && 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 "domain" agent skill from https://github.com/notque/vexjoy-agent/tree/main/skills/domain/domain into .opencode/skills/domain/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "domain", 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.
domainDomain-specific: SAP Commerce, OpenSearch detection, WordPress validation, enterprise search.
Domain is an agent skill from notque/vexjoy-agent. Domain-specific: SAP Commerce, OpenSearch detection, WordPress validation, enterprise search.
Its SKILL.md is about 3.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 15 other files, including reference files (for example `references/opensearch-detection-engineering.md`, `references/opensearch-detection-safety-patterns.md` and `references/opensearch-incident-escalation.md`).
It sits in Security, covering Security operations. It works with OpenSearch and WordPress. The repository describes itself as: VexJoy AI Agent with Jev Intelligent Routing - /do routes plain-English requests to the right specialist agent and gates the work with reviews, tests, and a learning loop. The licence is MIT.
11 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 5218674. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
AgentReadWriteBashGrepGlobEditTaskSkillmcp__plugin_playwright_playwright__browser_navigate…and 14 more on the same allowed-tools line.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gogitmakeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
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.
Domain loads about 3.7k tokens when it runs, and up to ~44k if it reads all its reference files. Until then it costs about 25 tokens; SKILL.md has 1,384 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 noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Agent, Read, Write, Bash, Grep, Glob, Edit, Task, Skill, mcp__plugin_playwright_playwright__browser_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 notque/vexjoy-agent at commit 5218674, republished under its MIT licence (© notque). 1,384 words, ~3,665 tokens.
.claude/skills/domain/SKILL.md (or your agent's skills folder). This skill also uses 14 other files; get the full folder from GitHub.Five domains: SAP Commerce Go review, SAP Commerce compliance audit, OpenSearch SIEM detection engineering, WordPress live validation, and enterprise search. Classify the request into one domain, then follow its section.
| Domain | Signal | Agent |
|---|---|---|
| SAPCC Review | sapcc review, 10-specialist review, lead review | golang-general-engineer |
| SAPCC Audit | sapcc audit, sapcc compliance, full repo audit | golang-general-engineer |
| OpenSearch Detection | SIEM, SIGMA, MITRE, detection engineering, SOC | (this session) |
| WordPress Validation | validate wordpress post, check live post, post rendering | (this session) |
| Enterprise Search | search relevance, ranking, BM25, query understanding | opensearch-elasticsearch-engineer |
10-agent domain-specialist review. Each agent masters one rule domain and scans every package. Differs from SAPCC Audit: audit segments by package (generalist), review segments by rule domain (specialist, cross-package).
Verify sapcc project and map the repo.
head -5 go.mod && grep -c "sapcc" go.mod
find . -name "*.go" -not -path "*/vendor/*" | wc -l
find . -name "*.go" -not -path "*/vendor/*" | sed 's|/[^/]*$||' | sort | uniq -c | sort -rnCheck key imports: go-bits, go-api-declarations, gophercloud, gorilla/mux, database/sql.
Gate: Repo mapped. If no sapcc imports, warn but continue.
Load references/sapcc-review-agent-dispatch-prompts.md for the 10 agent specs.
Dispatch all 10 in ONE message via Agent tool. Each agent gets: path to sapcc-code-patterns.md, assigned sections, domain-specific reference, all .go files to scan, finding output format.
Gate: All 10 dispatched in single message.
Run git status --short to capture modified and untracked files. Collect all
findings. Deduplicate by file:line (keep higher severity). Apply severity
boosts:
| Pattern Strength | Boost |
|---|---|
| NON-NEGOTIABLE (4+ repos) | +1 level |
| Strong Signal (2-3 repos) | No change |
| Context-Specific (1 repo) | -1 level |
Mark quick wins (single-line, no behavioral change, low test risk). Write
sapcc-review-report.md with: verdict, scorecard (10 domains x severity),
quick wins, findings by severity, positives, systemic recommendations.
--fix)Create worktree sapcc-review-fixes. Apply quick wins first. After each group:
go build ./... && go vet ./... && make check 2>/dev/null || go test ./....
If fix breaks tests, revert and note. Commit as
fix: apply sapcc-review findings (N fixes across M files).
Full-repo compliance scan. Segments by package (generalist per package).
Verify sapcc project (grep "sapcc" go.mod). Map packages:
find . -name "*.go" -not -path "./vendor/*" | sed 's|/[^/]*$||' | sort -u.
Count files per package. Plan 5-8 agents, 5-15 files each.
Gate: Packages mapped, agents planned.
Load references/sapcc-audit-phase-2-dispatch-agents.md for the dispatch prompt
(11 review areas: over-engineering, dead code, error messages, constructors,
interface contracts, copy-paste, HTTP handlers, database patterns, type patterns,
logging, mixed approaches). Dispatch all in one message via Task tool with
subagent_type=golang-general-engineer.
Deduplicate by file:line. Write sapcc-audit-report.md with: verdict,
must-fix/should-fix/nit counts, per-package summary table. Display verdict,
must-fix count, and top 5 findings inline.
Finding format: [MUST-FIX/SHOULD-FIX/NIT]: summary with file:line, current
code, correct code, and rationale.
Audit only: reads and reports. Does not modify code unless --fix.
SIEM detection authoring and validation on OpenSearch Security Analytics: SIGMA rules, query DSL translation, MITRE ATT&CK mapping, anomaly detection, correlation, and SOC incident escalation.
GET {index}/_mapping;
confirm every rule field exists. Absent fields cause silent failure.PUT _mapping, POST _aliases, not
abstract advice.| Pattern | Fix |
|---|---|
| Rule field absent from index mapping | GET {index}/_mapping; confirm or add field |
| MITRE mapping missing technique ID or tactic | Specify both T####.### and tactic |
| Escalation missing any of 9 fields | Complete all fields per checklist |
| Chained findings monitor on high-frequency schedule | Use static query indices |
| Field alias bootstrap on shared datastream | Create detection-owned index |
GET {index}/_mapping for each rule field. Check
cardinality for terms aggregations.references/opensearch-detection-engineering.md for translation
patterns. Apply FP suppression (CIDR, service-account prefixes, time windows).references/opensearch-detection-safety-patterns.md for the full checklist.references/opensearch-incident-escalation.md for template and KPIs.After authoring: "Have I verified every field via GET {index}/_mapping?"
After escalation: "Does the package include all 9 fields?"
After chained monitor: "Does this create a new query index per run?"
After MITRE mapping: "Did I include both technique ID and tactic?"
Loads a published WordPress post in a headless browser and verifies rendering matches what was uploaded. The browser is the source of truth.
Browser backend: Playwright MCP (default). Chrome DevTools MCP when the user says "check in my browser" or wants Lighthouse/performance profiling.
Load references/wordpress-phase-checks.md for the 4-step procedure. Navigate
to URL, wait for content area (try selectors: article -> .entry-content ->
.post-content -> main), remove cookie banners.
Gate: HTTP 200, content selector found. If 4xx/5xx or no selector: screenshot, FAIL, STOP.
Load references/wordpress-validation-checks.md for severity rationale and edge
cases. Load references/wordpress-playwright-tools.md for tool signatures.
Run all 7 checks:
| Check | Severity |
|---|---|
| Title match | BLOCKER |
| H2 structure | WARNING |
| Image loading | BLOCKER |
| JS console errors | WARNING |
| OG tags | WARNING |
| Meta description | WARNING |
| Placeholder/draft text | BLOCKER |
Execute each check via browser tools. Do not reason about outcomes -- run the command and report observed results.
Gate: All 7 checks executed with severity and evidence.
Test three viewports: mobile (375x812), tablet (768x1024), desktop (1440x900).
Per viewport: resize, screenshot, check overflow, check container visibility.
See references/wordpress-phase-checks.md for JS snippets.
Output structured report:
LIVE VALIDATION: {url}
CONTENT INTEGRITY: [PASS/FAIL/WARN] per check with evidence
SEO / SOCIAL: OG tags, meta description with values
RESPONSIVE: per viewport with overflow status and screenshot path
RESULT: {PASS | FAIL - N blockers, M warnings}| Error | Response |
|---|---|
| Playwright MCP unavailable | Skip report, do not retry |
| 4xx/5xx | Screenshot, report HTTP status, STOP at Phase 1 |
| Content selector not found | Screenshot + DOM snapshot; attempt OG checks without selector |
| Image network timeout | Report; if all fail, note possible CDN issue |
| Cookie banner blocks content | Phase 1 attempts DOM removal; DOM checks still work |
Search infrastructure: relevance tuning, query understanding, index management, quality measurement, performance optimization. Always specify target platform and version.
| Mode | Signal | Load |
|---|---|---|
| RELEVANCE | BM25, boost, LTR, ranking | references/search-relevance-tuning.md |
| QUERY | intent, entity extraction, expansion, synonyms | references/search-query-understanding.md |
| INDEX | schema, mapping, analyzer, reindex, ILM | references/search-index-management.md |
| QUALITY | nDCG, MRR, judgments, A/B test | references/search-search-quality.md |
| PERFORMANCE | slow query, shard, cache, circuit breaker | references/search-performance-optimization.md |
| ARCHITECTURE | hybrid search, vector search, platform selection | Load per sub-topic |
Always load references/search-llm-search-failure-modes.md as a guardrail.
| Platform | Query Language | Config |
|---|---|---|
| Elasticsearch 8.x | Query DSL (JSON) | elasticsearch.yml |
| OpenSearch 2.x | Query DSL (JSON) | opensearch.yml |
| Solr 9.x | SolrQL / JSON Request API | solrconfig.xml |
| Vespa | YQL | services.xml |
| Typesense | REST params | CLI / JSON |
Cross-platform traps: OpenSearch diverges from ES 7.10 on security/ML/alerting.
ES _field_caps changed between 7.x and 8.x. Solr edismax != ES multi_match.
Load on demand when a phase needs detailed lookup data.
| Context | Reference |
|---|---|
| SAPCC Review Phase 2: 10 agent specs | references/sapcc-review-agent-dispatch-prompts.md |
| SAPCC Audit Phase 2: dispatch prompt | references/sapcc-audit-phase-2-dispatch-agents.md |
| SIGMA authoring, DSL translation, MITRE catalog | references/opensearch-detection-engineering.md |
| Detector failures, alias conflicts, index flood | references/opensearch-detection-safety-patterns.md |
| Escalation checklist, severity SLAs, KPIs | references/opensearch-incident-escalation.md |
| WordPress check specs, severities, edge cases | references/wordpress-validation-checks.md |
| WordPress Playwright tool signatures | references/wordpress-playwright-tools.md |
| WordPress phase procedures with JS snippets | references/wordpress-phase-checks.md |
| Search relevance tuning, BM25, LTR, boosts | references/search-relevance-tuning.md |
| Query understanding, intent, expansion | references/search-query-understanding.md |
| Index management, schema, analyzers, ILM | references/search-index-management.md |
| Search quality metrics, evaluation methodology | references/search-search-quality.md |
| Search performance, caching, sharding | references/search-performance-optimization.md |
| LLM failure modes in search engineering | references/search-llm-search-failure-modes.md |
© notque, 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 14 other files (references) in skills/domain/domain of notque/vexjoy-agent.
Open the folder on GitHubat commit 5218674
Domain 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 |
|---|---|---|---|---|---|---|
| Domain this skillnotque/vexjoy-agent | 435 | — | ~3.7k | Automated safety check: Notes | MIT | |
| Elasticsearch Auditaspectrr/deer | 405 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Dfirtransilienceai/communitytools | 559 | — | ~1.5k | Automated safety check: Pass | MIT | |
| Keeljoseconti/declaracion-renta-espana | 190 | — | ~11k | Automated safety check: Warn | GPL-3.0-or-later | |
| Threat Database UpdateFlorianBruniaux/claude-code-ultimate-guide | 6.1k | — | ~680 | Automated safety check: Pass | CC-BY-SA-4.0 | |
| Enrich Iocdandye/ai-runbooks | 127 | — | ~702 | Automated safety check: Pass | Apache-2.0 |
aspectrr/deer
Enable, configure, and query Elasticsearch security audit logs.
transilienceai/communitytools
Digital forensics and incident response - Windows event log analysis, PCAP forensics, filesystem artifact analysis, AD attack detection, and timeline correlation.
joseconti/declaracion-renta-espana
A skill your agent uses for ANY new software project from idea to release — websites, WordPress/WooCommerce plugins, MCP servers, web apps, components, or libraries.
FlorianBruniaux/claude-code-ultimate-guide
Refreshes the guide's coding-agent and MCP security threat data through AgentSec Triage: research advisories, add tested records and synchronize the public feed.
dandye/ai-runbooks
Enrich an IOC (IP, domain, hash, URL) with threat intelligence.
duracelltomi/gtm4wp
Guide to maintain creating modern and secure code while developing WordPress plugins.
notque/vexjoy-agent
Deterministic palette/matrix pixel art (not AI). An agent skill from notque/vexjoy-agent.
notque/vexjoy-agent
Pull request lifecycle: commit, codex review, sync, review, fix, status, cleanup, and PR mining.
notque/vexjoy-agent
Improve architecture across modules by deepening interfaces.
notque/vexjoy-agent
Code quality: cleanup, linting, formatting, quality gates. An agent skill from notque/vexjoy-agent.
notque/vexjoy-agent
Statistical rule discovery from Go codebase patterns. An agent skill from notque/vexjoy-agent.
notque/vexjoy-agent
Review and fix temporal references in code comments. An agent skill from notque/vexjoy-agent.
Works with
Categories
Domain-specific: SAP Commerce, OpenSearch detection, WordPress validation, enterprise search. Domain is an agent skill from notque/vexjoy-agent. Domain-specific: SAP Commerce, OpenSearch detection, WordPress validation, enterprise search.
Domain fits situations like: tasks that involve Security operations.
Run `npx skills add notque/vexjoy-agent --skill domain -a claude-code`. Or copy the skill folder (skills/domain/domain in notque/vexjoy-agent) into .claude/skills/domain in your project. Claude Code loads it when a task matches its description.
Run `npx skills add notque/vexjoy-agent --skill domain -a codex`. Or copy the skill folder (skills/domain/domain in notque/vexjoy-agent) into .agents/skills/domain 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 notque/vexjoy-agent --skill domain -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/domain, .gemini/skills/domain, .github/skills/domain and .opencode/skills/domain in your project.
Going by SKILL.md and its folder, Domain needs the command-line tools its instructions call (go, git and make). Its frontmatter pre-approves these tools: Agent, Read, Write, Bash, Grep, Glob, Edit, Task, Skill, mcp__plugin_playwright_playwright__browser_navigate, mcp__plugin_playwright_playwright__browser_wait_for, mcp__plugin_playwright_playwright__browser_snapshot, mcp__plugin_playwright_playwright__browser_evaluate, mcp__plugin_playwright_playwright__browser_network_requests, mcp__plugin_playwright_playwright__browser_console_messages, mcp__plugin_playwright_playwright__browser_resize, mcp__plugin_playwright_playwright__browser_take_screenshot, mcp__chrome-devtools__navigate_page, mcp__chrome-devtools__take_screenshot, mcp__chrome-devtools__take_snapshot, mcp__chrome-devtools__list_console_messages, mcp__chrome-devtools__list_network_requests, mcp__chrome-devtools__lighthouse_audit, mcp__chrome-devtools__resize_page.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Domain is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.7k tokens (SKILL.md is roughly 15k 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 40k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Domain: Elasticsearch Audit (aspectrr/deer, 405 stars), Dfir (transilienceai/communitytools, 559 stars), Keel (joseconti/declaracion-renta-espana, 190 stars) and Threat Database Update (FlorianBruniaux/claude-code-ultimate-guide, 6.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
notque (a GitHub user) maintains it in notque/vexjoy-agent, which has 435 GitHub stars. The repository holds 61 skills in this directory. The repository was last updated on October 3, 2026.
Source: notque/vexjoy-agent on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.