Email Blast
antiwork/gumroad
Send one-off email blasts to Gumroad creators directly via production console, no PR or deploy needed.
MetricsService, RedisMetricsCollector, ProcessPhotoMetrics, metrics table, Redis stats, leaderboards, XP processing, and photo processing state (processedat/fp/tags/xp).
$ npx skills add OpenLitterMap/openlittermap-web --skill metrics-pipeline -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install OpenLitterMap/openlittermap-web metrics-pipeline --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/OpenLitterMap/openlittermap-web.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.ai/skills/metrics-pipeline .claude/skills/metrics-pipeline && 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 "metrics-pipeline" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/metrics-pipeline into .claude/skills/metrics-pipeline/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "metrics-pipeline", 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/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/metrics-pipelineType 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 OpenLitterMap/openlittermap-web --skill metrics-pipeline -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install OpenLitterMap/openlittermap-web metrics-pipeline --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenLitterMap/openlittermap-web.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.ai/skills/metrics-pipeline .agents/skills/metrics-pipeline && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "metrics-pipeline" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/metrics-pipeline into .agents/skills/metrics-pipeline/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "metrics-pipeline", 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 OpenLitterMap/openlittermap-web --skill metrics-pipeline -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install OpenLitterMap/openlittermap-web metrics-pipeline --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenLitterMap/openlittermap-web.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.ai/skills/metrics-pipeline .cursor/skills/metrics-pipeline && 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 "metrics-pipeline" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/metrics-pipeline into .cursor/skills/metrics-pipeline/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "metrics-pipeline", 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/OpenLitterMap/openlittermap-web.git --path .ai/skills/metrics-pipeline--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 OpenLitterMap/openlittermap-web --skill metrics-pipeline -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install OpenLitterMap/openlittermap-web metrics-pipeline --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenLitterMap/openlittermap-web.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.ai/skills/metrics-pipeline .gemini/skills/metrics-pipeline && 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 "metrics-pipeline" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/metrics-pipeline into .gemini/skills/metrics-pipeline/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "metrics-pipeline", 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 OpenLitterMap/openlittermap-web metrics-pipelineInstalls 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 OpenLitterMap/openlittermap-web --skill metrics-pipeline -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/OpenLitterMap/openlittermap-web.git skills-src && mkdir -p .github/skills && cp -r skills-src/.ai/skills/metrics-pipeline .github/skills/metrics-pipeline && 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 "metrics-pipeline" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/metrics-pipeline into .github/skills/metrics-pipeline/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "metrics-pipeline", 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 OpenLitterMap/openlittermap-web --skill metrics-pipeline -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install OpenLitterMap/openlittermap-web metrics-pipeline --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenLitterMap/openlittermap-web.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.ai/skills/metrics-pipeline .opencode/skills/metrics-pipeline && 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 "metrics-pipeline" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/metrics-pipeline into .opencode/skills/metrics-pipeline/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "metrics-pipeline", 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.
metrics-pipelineMetricsService, RedisMetricsCollector, ProcessPhotoMetrics, metrics table, Redis stats, leaderboards, XP processing, and photo processing state (processedat/fp/tags/xp).
Metrics Pipeline is an agent skill from OpenLitterMap/openlittermap-web. MetricsService, RedisMetricsCollector, ProcessPhotoMetrics, metrics table, Redis stats, leaderboards, XP processing, and photo processing state (processedat/fp/tags/xp).
Its SKILL.md is about 1.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Databases. It works with Redis, MySQL and PHP. The repository describes itself as: https://opengeospatialdata.springeropen.com/articles/10.1186/s40965-018-0050-y. The licence is GPL-3.0.
8 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit ac688aa. 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).
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.
Metrics Pipeline loads about 1.8k tokens when it runs. Until then it costs about 47 tokens; SKILL.md has 501 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 OpenLitterMap/openlittermap-web at commit ac688aa, republished under its GPL-3.0 licence (© OpenLitterMap). 501 words, ~1,781 tokens.
.claude/skills/metrics-pipeline/SKILL.md (or your agent's skills folder).MetricsService is the single writer for all metrics — MySQL time-series and Redis aggregates. Nothing else touches metric counters. This is the golden rule.
app/Services/Metrics/MetricsService.php — Single writer for MySQL + Redisapp/Services/Redis/RedisMetricsCollector.php — Redis operations (stats, HLL, rankings, tags)app/Services/Redis/RedisKeys.php — All Redis key builders (single source of truth for naming)app/Listeners/Metrics/ProcessPhotoMetrics.php — Queued listener on TagsVerifiedByAdminapp/Events/TagsVerifiedByAdmin.php — Trigger event for metrics processingapp/Enums/LocationType.php — Global(0), Country(1), State(2), City(3) with scope prefixesMetricsService writes to the metrics table and Redis metric keys. No other code may increment/decrement counters.processed_at, processed_fp, processed_tags, processed_xp. A photo with processed_at = null has never affected aggregates.processed_tags JSON against new summary and writes only non-zero deltas. Safe to call repeatedly on any photo.GeneratePhotoSummaryService::run() MUST be called before TagsVerifiedByAdmin dispatches. MetricsService reads from photo.summary.metrics table. RedisKeys::* is single source of truth for key naming.processed_xp must be INT UNSIGNED, not TINYINT. Overflow bug documented in migration 2026_02_23_182605.tags_count = objects + materials + brands + custom_tags.ProcessPhotoMetrics logs a warning when photo not found. If a photo is soft-deleted before the queued listener runs, ProcessPhotoMetrics::handle() logs a warning and returns gracefully. It does NOT throw or retry.// MetricsService::processPhoto() — called by ProcessPhotoMetrics listener
DB::transaction(function () use ($photo) {
$photo = Photo::whereKey($photo->id)->lockForUpdate()->first();
$metrics = $this->extractMetricsFromPhoto($photo); // reads photo.summary
$fingerprint = $this->computeFingerprint($metrics['tags']);
// Skip if nothing changed (fingerprint + XP both match)
if ($photo->processed_fp === $fingerprint &&
(int)$photo->processed_xp === (int)$metrics['xp']) {
return;
}
// Route to create (first time) or update (re-tag)
if ($photo->processed_at !== null) {
$this->doUpdate($photo, $metrics, $fingerprint);
} else {
$this->doCreate($photo, $metrics, $fingerprint);
}
});Each photo writes up to 40 rows: 5 timescales (all-time, daily, weekly, monthly, yearly) x 4 location scopes (global, country, state, city) x 2 (aggregate user_id=0 + per-user user_id>0).
DB::table('metrics')->upsert($rows,
['timescale', 'location_type', 'location_id', 'user_id', 'year', 'month', 'week', 'bucket_date'],
[
'uploads' => DB::raw('GREATEST(uploads + VALUES(uploads), 0)'),
'tags' => DB::raw('GREATEST(tags + VALUES(tags), 0)'),
// ... same for brands, materials, custom_tags, litter, xp
]
);Uploads delta: +1 for create, 0 for update, -1 for delete. GREATEST(..., 0) prevents negative counters.
private function updateRedis(Photo $photo, array $payload, string $operation): void
{
DB::afterCommit(function () use ($photo, $payload, $operation) {
RedisMetricsCollector::processPhoto($photo, $payload, $operation);
});
}RedisKeys::global() // {g}
RedisKeys::country($id) // {c:$id}
RedisKeys::state($id) // {s:$id}
RedisKeys::city($id) // {ci:$id}
RedisKeys::user($userId) // {u:$userId}
RedisKeys::stats($scope) // $scope:stats (HASH: uploads, tags, litter, xp, ...)
RedisKeys::hll($scope) // $scope:hll (HyperLogLog for contributor count)
RedisKeys::objects($scope) // $scope:obj (HASH: object_id => count)
RedisKeys::ranking($scope, $dim) // $scope:rank:$dim (ZSET)
RedisKeys::xpRanking($scope) // $scope:lb:xp (ZSET: user_id => xp, for leaderboards)
RedisKeys::userBitmap($userId) // {u:$userId}:bitmap (activity bitmap)AddTagsToPhotoAction::updateVerification() — dispatches immediately after summary + XP (both web and mobile use this path).TeamPhotosController::approve() — dispatches per photo after atomic is_public = true update.// MetricsService::deletePhoto() — called synchronously in controllers before soft-delete
// Reads processed_tags JSON, applies negative deltas, clears processed_* columns
$photo->update([
'processed_at' => null,
'processed_fp' => null,
'processed_tags' => null,
'processed_xp' => null,
]);In Redis, the delete operation also prunes zero-XP members from leaderboard ZSETs:
$pipe->zIncrBy(RedisKeys::xpRanking($scope), -abs($metrics['xp']), (string)$userId);
$pipe->zRemRangeByScore(RedisKeys::xpRanking($scope), '-inf', '0');This keeps Redis consistent with MySQL (which filters xp > 0).
DB::table('metrics')->increment(...) or Redis::hincrby(...) directly.TagsVerifiedByAdmin before summary generation. MetricsService reads photo.summary — null summary = zero metrics.processed_xp as TINYINT. Values above 127 overflow. Column must be UNSIGNED INT.Photo::whereKey($id)->lockForUpdate()->first() inside the transaction.metrics table is authoritative.tags_count. Categories are groupings, not countable items. Only objects + materials + brands + custom_tags.ProcessPhotoMetrics can't find the photo. ProcessPhotoMetrics logs a warning (Log::warning(...)) when the photo is not found (soft-deleted or missing). It does not throw — the job completes successfully to avoid retries.is_public as the upload metrics gate. UploadPhotoController gates recordUploadMetrics() on $team->isSchool(), NOT on $photo->is_public. Private-by-choice photos (non-school) still get immediate upload XP. Only school photos defer metrics to teacher approval.© OpenLitterMap, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .ai/skills/metrics-pipeline of OpenLitterMap/openlittermap-web.
Open the folder on GitHubat commit ac688aa
Metrics Pipeline 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 |
|---|---|---|---|---|---|---|
| Metrics Pipeline this skillOpenLitterMap/openlittermap-web | 134 | — | ~1.8k | Automated safety check: Pass | GPL-3.0 | |
| Email Blastantiwork/gumroad | 9.8k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Tgf Server Devthkhxm/tgf | 128 | — | ~1.3k | Automated safety check: Notes | MIT | |
| Alsacreations Guidelinesalsacreations/kiwipedia | 338 | — | ~900 | Automated safety check: Pass | None | |
| Cache Debugzhyese/grid-qa | 131 | — | ~646 | Automated safety check: Pass | Custom licence | |
| Resume Backend Project OptimizerLAIJiangFeng/resume-builder | 248 | — | ~868 | Automated safety check: Pass | None |
antiwork/gumroad
Send one-off email blasts to Gumroad creators directly via production console, no PR or deploy needed.
thkhxm/tgf
基于 tgf v2(github.com/thkhxm/tgf/v2)用确定性的 tgfctl 工作流创建、验证和维护 Go 游戏服务器项目。
alsacreations/kiwipedia
Guidelines techniques et conventions internes d'Alsacréations (Kiwipedia) — HTML, CSS, JavaScript, TypeScript, Vue.js, WordPress, PHP/MySQL, accessibilité, performance, SEO, RGPD, écoconception…
zhyese/grid-qa
排查问答缓存问题(不命中/脏缓存/黑名单误拦/置信度过滤/多轮不缓存)时使用。覆盖三级缓存(Redis/MySQL/Semantic)+黑名单+置信度规则。
LAIJiangFeng/resume-builder
将中文后端项目经历改写为高质量、可面试追问、强数据化的简历要点。适用于用户提供“项目经历/主要工作/职责描述”后,要求按统一模板输出“负责xxx功能 + 关键技术细节组合 + 解决问题 + 数据化结果”的场景;适用于 Java 后端求职、简历优化、面试前项目复盘,且需要对齐面试高频考点(Java 集合与并发、MySQL、Redis、Spring、消息队列、系统设计等)时使用。
s0ld13rr/pentestcode
Database RCE paths — UDF, xpcmdshell, COPY TO PROGRAM, Redis key write.
OpenLitterMap/openlittermap-web
Styles applications using Tailwind CSS v3 utilities. An agent skill from OpenLitterMap/openlittermap-web.
OpenLitterMap/openlittermap-web
OpenLitterMap v5 architecture reference. An agent skill from OpenLitterMap/openlittermap-web.
OpenLitterMap/openlittermap-web
AchievementEngine, AchievementRepository, milestone checkers, AchievementsSeeder, userachievements pivot, AchievementsController API, and achievement evaluation flow.
OpenLitterMap/openlittermap-web
AdminController, photo approval, tag editing, deletion, MetricsService integration, admin middleware, verification queue, and admin XP.
OpenLitterMap/openlittermap-web
REST API endpoints, route structure, auth guards, request/response contracts, error patterns, and the full API surface for web SPA and mobile clients.
OpenLitterMap/openlittermap-web
ClusteringService, tile keys, dirty tiles/teams, clustering commands, ClusterController GeoJSON API, PhotoObserver dirty marking, and map cluster rendering.
Categories
MetricsService, RedisMetricsCollector, ProcessPhotoMetrics, metrics table, Redis stats, leaderboards, XP processing, and photo processing state (processedat/fp/tags/xp). Metrics Pipeline is an agent skill from OpenLitterMap/openlittermap-web. MetricsService, RedisMetricsCollector, ProcessPhotoMetrics, metrics table, Redis stats, leaderboards, XP processing, and photo processing state (processedat/fp/tags/xp).
Metrics Pipeline fits situations like: databases work in your project.
Run `npx skills add OpenLitterMap/openlittermap-web --skill metrics-pipeline -a claude-code`. Or copy the skill folder (.ai/skills/metrics-pipeline in OpenLitterMap/openlittermap-web) into .claude/skills/metrics-pipeline in your project. Claude Code loads it when a task matches its description.
Run `npx skills add OpenLitterMap/openlittermap-web --skill metrics-pipeline -a codex`. Or copy the skill folder (.ai/skills/metrics-pipeline in OpenLitterMap/openlittermap-web) into .agents/skills/metrics-pipeline 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 OpenLitterMap/openlittermap-web --skill metrics-pipeline -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/metrics-pipeline, .gemini/skills/metrics-pipeline, .github/skills/metrics-pipeline and .opencode/skills/metrics-pipeline in your project.
SKILL.md names no scripts, command-line tools or credentials: Metrics Pipeline 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.
Metrics Pipeline is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.8k tokens (SKILL.md is roughly 7.1k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Metrics Pipeline: Email Blast (antiwork/gumroad, 9.8k stars), Tgf Server Dev (thkhxm/tgf, 128 stars), Alsacreations Guidelines (alsacreations/kiwipedia, 338 stars) and Cache Debug (zhyese/grid-qa, 131 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
OpenLitterMap (a GitHub organization) maintains it in OpenLitterMap/openlittermap-web, which has 134 GitHub stars. The repository holds 16 skills in this directory. The repository was last updated on September 14, 2026.
Source: OpenLitterMap/openlittermap-web on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.