Configuring Horizon
coollabsio/coolify
A skill your agent uses whenever the user mentions Horizon by name in a Laravel context.
AdminController, photo approval, tag editing, deletion, MetricsService integration, admin middleware, verification queue, and admin XP.
$ npx skills add OpenLitterMap/openlittermap-web --skill admin-system -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install OpenLitterMap/openlittermap-web admin-system --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/admin-system .claude/skills/admin-system && 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 "admin-system" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/admin-system into .claude/skills/admin-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "admin-system", 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/admin-systemType 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 admin-system -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install OpenLitterMap/openlittermap-web admin-system --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/admin-system .agents/skills/admin-system && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "admin-system" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/admin-system into .agents/skills/admin-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "admin-system", 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 admin-system -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install OpenLitterMap/openlittermap-web admin-system --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/admin-system .cursor/skills/admin-system && 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 "admin-system" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/admin-system into .cursor/skills/admin-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "admin-system", 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/admin-system--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 admin-system -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install OpenLitterMap/openlittermap-web admin-system --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/admin-system .gemini/skills/admin-system && 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 "admin-system" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/admin-system into .gemini/skills/admin-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "admin-system", 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 admin-systemInstalls 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 admin-system -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/admin-system .github/skills/admin-system && 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 "admin-system" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/admin-system into .github/skills/admin-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "admin-system", 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 admin-system -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 admin-system --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/admin-system .opencode/skills/admin-system && 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 "admin-system" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/admin-system into .opencode/skills/admin-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "admin-system", 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.
admin-systemAdminController, photo approval, tag editing, deletion, MetricsService integration, admin middleware, verification queue, and admin XP.
Admin System is an agent skill from OpenLitterMap/openlittermap-web. AdminController, photo approval, tag editing, deletion, MetricsService integration, admin middleware, verification queue, and admin XP.
Its SKILL.md is about 3.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It works with PHP. The repository describes itself as: https://opengeospatialdata.springeropen.com/articles/10.1186/s40965-018-0050-y. The licence is GPL-3.0.
10 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.
Admin System loads about 3.9k tokens when it runs. Until then it costs about 37 tokens; SKILL.md has 1,051 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). 1,051 words, ~3,871 tokens.
.claude/skills/admin-system/SKILL.md (or your agent's skills folder).Admin photo review: approve, edit tags, delete. Quality gate between user submissions and public data.
app/Http/Controllers/AdminController.php — 4 methods: verify, destroy, updateDelete, getCountriesWithPhotosapp/Http/Controllers/Admin/AdminQueueController.php — Paginated queue endpoint with filters + tag transform (GET /api/admin/photos)app/Http/Controllers/Admin/AdminResetTagsController.php — Reset tags on a photo: reverse metrics, delete PhotoTags, reset state to unverifiedapp/Http/Middleware/IsAdmin.php — checks hasRole('admin') or hasRole('superadmin') on web guardapp/Events/TagsVerifiedByAdmin.php — event with full constructor (photo_id, user_id, country_id, state_id, city_id, team_id)app/Actions/Tags/AddTagsToPhotoAction.php — v5 tag pipeline (creates PhotoTags, summary, XP)app/Services/Metrics/MetricsService.php — deletePhoto() for metric reversal before soft deleteapp/Helpers/helpers.php — rewardXpToAdmin(), logAdminAction()app/Http/Controllers/Admin/AdminStatsController.php — Dashboard stats (cached 60s): queue totals, by-verification, by-country, user counts, flagged usernamesapp/Http/Controllers/Admin/AdminUsersController.php — 4 methods: index (list/search/filter), trust (toggle), approveAll (bulk), updateUsername (moderation)app/Http/Requests/Admin/UpdateUsernameRequest.php — Validation: 3–30 chars, alphanumeric + hyphens, unique. Superadmin auth gate.app/Mail/SchoolManagerInvite.php — Queued email sent when school_manager role is granted via toggleSchoolManager()resources/js/stores/admin.js — Pinia store: fetchPhotos, fetchCountries, approvePhoto, deletePhoto, updateTagsAndApprove, fetchUsers, fetchStats, toggleTrust, approveAllForUser, updateUsernameresources/js/views/Admin/AdminQueue.vue — Photo review page (three-panel: filters | photo | tags)resources/js/views/Admin/AdminUsers.vue — User management page (stats cards, search, filters, table)resources/js/views/Admin/components/AdminQueueHeader.vue — Header bar with pending count, navigation, action buttonsresources/js/views/Admin/components/AdminQueueFilters.vue — Filter sidebar (country, photo ID, user ID, date range)resources/js/views/Admin/components/UserRow.vue — Table row: trust toggle, approve all, username editor (superadmin gated)tests/Feature/Admin/AdminVerificationTest.php — 8 tests (approve, delete, edit+approve, retag, idempotency, auth, school exclusion)tests/Feature/Admin/AdminQueueTest.php — 12 tests (queue endpoint: filters, pagination, exclusions, auth)tests/Feature/Admin/AdminResetTagsTest.php — 4 tests (reset clears state, metrics reversal, skip approved, non-admin rejected)tests/Feature/Admin/AdminStatsTest.php — 5 tests (cache, counts, by-verification, by-country, auth)tests/Feature/Admin/AdminUsersTest.php — 9 tests (list, search, sort, trust filter, flagged filter, pagination, auth, school manager invite email on grant, no email on revoke)tests/Feature/Admin/AdminTrustTest.php — 10 tests (trust toggle, approve-all, superadmin-only, school exclusion, idempotency)tests/Feature/Admin/AdminUsernameModerationTest.php — 13 tests (username edit, flagging lifecycle, validation rules, auth)readme/Admin.md — full spec (Phase 1–3 complete)photo.summary is null → 422. No tags = nothing to approve.WHERE is_public = true AND verified < ADMIN_APPROVED. Second approve matches 0 rows, no event fires, no XP awarded.is_public = false photos never enter admin queue. The WHERE is_public = true condition enforces this.deletePhoto() runs BEFORE $photo->delete(). If it throws, delete is aborted.$photo->delete() uses SoftDeletes trait. No hard deletes.TagsVerifiedByAdmin needs all 6 args: photo_id, user_id, country_id, state_id, city_id, team_id.rewardXpToAdmin() only called when an action actually changed state (row updated).AddTagsToPhotoAction::run() + approve, all atomic.Auth::user() (default = web). Tests use actingAs($user) with no guard arg.// Precondition
if ($photo->summary === null) return 422;
// Atomic update
$affected = Photo::where('id', $photo->id)
->where('is_public', true)
->where('verified', '<', VerificationStatus::ADMIN_APPROVED->value)
->update(['verified' => VerificationStatus::ADMIN_APPROVED->value]);
// Only if row was updated
if ($affected > 0) {
event(new TagsVerifiedByAdmin($photo->id, $photo->user_id, ...));
rewardXpToAdmin();
}if ($photo->processed_at !== null) {
$this->metricsService->deletePhoto($photo); // Reverses metrics
}
// Littercoin detachment...
$photo->delete(); // Soft delete
rewardXpToAdmin();DB::transaction(function () use ($request, $photo) {
PhotoTag::where('photo_id', $photo->id)->delete();
$this->addTagsAction->run($photo->user_id, $photo->id, $request->tags);
});
$photo->refresh();
// Then same atomic approve as verify()Photo::query()
->where('verified', '<', VerificationStatus::ADMIN_APPROVED->value)
->where('is_public', true)
->whereNotNull('summary')
->groupBy('country_id');// GET /api/admin/photos — AdminQueueController
Photo::query()
->where('is_public', true)
->where('verified', '<', VerificationStatus::ADMIN_APPROVED->value)
->whereNotNull('summary')
->with(['user:id,name', 'countryRelation:id,country,shortcode',
'photoTags.category', 'photoTags.object',
'photoTags.primaryCustomTag', 'photoTags.extraTags.extraTag'])
->when($request->country_id, fn ($q) => $q->where('country_id', $request->country_id))
->when($request->user_id, fn ($q) => $q->where('user_id', $request->user_id))
->when($request->photo_id, fn ($q) => $q->where('id', $request->photo_id))
->when($request->date_from, fn ($q) => $q->where('created_at', '>=', $request->date_from))
->when($request->date_to, fn ($q) => $q->where('created_at', '<=', $request->date_to))
->orderBy('created_at', 'asc')
->paginate($perPage);
// Response manually built (avoids Location accessor crash on null updated_at)
// Includes new_tags[] with hydrated PhotoTag data for frontend tag editing// GET /api/admin/stats — AdminStatsController (cached 60s)
Cache::remember('admin:dashboard:stats', 60, function () {
// queue_total: is_public=true, verified=VERIFIED, summary NOT NULL
// queue_today: same + created_at >= today
// by_verification: grouped by VerificationStatus enum labels
// by_country: top 20 countries with pending photos
// total_users, users_today, flagged_usernames
});// GET /api/admin/users — AdminUsersController@index
User::query()
->withCount('photos')
->with('roles:id,name')
->when($search, fn ($q) => $q->where(function ($q) use ($search) {
$q->where('name', 'LIKE', "%{$search}%")
->orWhere('username', 'LIKE', "%{$search}%")
->orWhere('email', 'LIKE', "%{$search}%");
}))
->when($trustFilter === 'trusted', fn ($q) => $q->where('verification_required', false))
->when($trustFilter === 'untrusted', fn ($q) => $q->where('verification_required', true))
->when($flagged, fn ($q) => $q->where('username_flagged', true))
->orderBy($sortBy, $sortDir)
->paginate($perPage);
// Response includes pending_photos count per user (is_public=true, verified < ADMIN_APPROVED)// POST /api/admin/users/{user}/trust — superadmin only
// Sets verification_required = !trusted
// Does NOT retroactively approve existing photos
// No logAdminAction() — schema needs target_type for user-target actions// POST /api/admin/users/{user}/approve-all — superadmin only, max 500
// Same atomic WHERE as verify(): is_public=true AND verified < ADMIN_APPROVED
// Fires TagsVerifiedByAdmin per photo + rewardXpToAdmin()// PATCH /api/admin/users/{user}/username — superadmin only
// UpdateUsernameRequest: 3-30 chars, alphanumeric + hyphens, unique
// Clears username_flagged after edit
// username_flagged set to true when user self-changes username (in ApiSettingsController)All under /api/admin/ prefix with admin middleware:
| Method | Route | Controller Method |
|---|---|---|
| GET | /api/admin/photos | AdminQueueController (paginated queue) |
| POST | /api/admin/verify | AdminController@verify |
| POST | /api/admin/destroy | AdminController@destroy |
| POST | /api/admin/contentsupdatedelete | AdminController@updateDelete |
| POST | /api/admin/reset-tags | AdminResetTagsController (reset to unverified) |
| GET | /api/admin/get-countries-with-photos | AdminController@getCountriesWithPhotos |
| Method | Route | Controller Method |
|---|---|---|
| GET | /api/admin/stats | AdminStatsController (cached 60s) |
| Method | Route | Controller Method | Auth |
|---|---|---|---|
| GET | /api/admin/users | AdminUsersController@index | admin |
| POST | /api/admin/users/{user}/trust | AdminUsersController@trust | superadmin |
| POST | /api/admin/users/{user}/approve-all | AdminUsersController@approveAll | superadmin |
| PATCH | /api/admin/users/{user}/username | AdminUsersController@updateUsername | superadmin |
| POST | /api/admin/users/{user}/school-manager | AdminUsersController@toggleSchoolManager | superadmin |
| Route | Was | Replaced by |
|---|---|---|
/api/admin/verify-tags-as-correct | VerifyImageWithTagsController | AdminController::verify() |
/api/admin/find-photo-by-id | FindPhotoByIdController | AdminQueueController |
/api/admin/get-next-image-to-verify | GetNextImageToVerifyController | AdminQueueController |
/api/admin/go-back-one | GoBackOnePhotoController | AdminQueueController |
| Path | Component | Purpose |
|---|---|---|
/admin/queue | AdminQueue.vue | Photo review queue UI |
/admin/users | AdminUsers.vue | User management + username moderation |
/admin/redis/:userId? | Redis.vue | Redis analytics |
| ID | Role | Access |
|---|---|---|
| 1 | superadmin | All admin actions + trust management + username moderation + Horizon |
| 2 | admin | Photo review (approve, edit, delete) + user list + stats |
| 3 | helper | Tag editing only (bounding box annotation role) |
POST /api/admin/users/{user}/trust)POST /api/admin/users/{user}/approve-all)PATCH /api/admin/users/{user}/username)auth:api guard in tests. Admin middleware uses default (web) guard. Use actingAs($user) with no guard argument./api prefix. Routes are in routes/api.php which adds /api prefix. Use /api/admin/verify, not /admin/verify.TagsVerifiedByAdmin when $affected > 0.$photo->delete() (soft delete). Never $photo->forceDelete().deletePhoto() before soft delete if processed_at is set.AddTagsToPhotoAction::run() (v5 action in App\Actions\Tags). CalculateTagsDifferenceAction also deleted — was only used by AddTagsTrait.is_public = false photos are excluded by the atomic WHERE. Don't add special handling.$photo->toArray() for queue response. The Location model's updatedAtDiffForHumans accessor crashes on null updated_at. Build the response array manually.whereNotNull('summary') in queue query. Untagged photos must not appear in the admin queue.per_page. Always min($request->per_page, 50) to prevent abuse.hasRole('superadmin').trust() sets verification_required but does NOT approve existing photos. Use approveAll() separately.username_flagged lifecycle. User self-change → flagged=true. Superadmin edit → flagged=false. The flag drives the /api/admin/users?flagged=true filter.UpdateUsernameRequest: 3–30 chars, /^[a-zA-Z0-9-]+$/, unique. Don't duplicate validation in controller.admin:dashboard:stats — 60s TTL. Don't forget to invalidate if adding manual cache busting.AdminQueueController, 12 tests) + Queue UI (AdminQueue.vue with filters, tag editing, approve/edit/delete). Reuses existing tagging components.AdminUsersController: list/search/filter, trust toggle, approve-all, username moderation, school manager toggle + invite email), dashboard stats (AdminStatsController), username flagging system. 51 total admin tests passing across 7 test files.BoundingBoxController returns 410 Gone on all 5 endpoints (/api/bbox/*). Was entirely v4 with broken TagsVerifiedByAdmin signature. Routes left wired for clean 410 responses.readme/Teams.md and teams-safeguarding skill. Key differences from admin queue: status filter (pending/approved/all) instead of country filter, Revoke replaces Reset, member stats tab, safeguarding pseudonyms.© 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/admin-system of OpenLitterMap/openlittermap-web.
Open the folder on GitHubat commit ac688aa
Admin System 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 |
|---|---|---|---|---|---|---|
| Admin System this skillOpenLitterMap/openlittermap-web | 134 | — | ~3.9k | Automated safety check: Pass | GPL-3.0 | |
| Configuring Horizoncoollabsio/coolify | 63k | 4 repos | ~898 | Automated safety check: Pass | MIT | |
| Tailwindcss Developmentanonaddy/anonaddy | 4.9k | 10 repos | ~865 | Automated safety check: Pass | MIT | |
| Fortify Developmentcoollabsio/coolify | 63k | 4 repos | ~1.9k | Automated safety check: Pass | MIT | |
| MCP Developmentcoollabsio/coolify | 63k | 1 repos | ~949 | Automated safety check: Pass | MIT | |
| WooCommerce Code Reviewwoocommerce/woocommerce | 11k | 3 repos | ~1.1k | Automated safety check: Pass | Custom licence |
coollabsio/coolify
A skill your agent uses whenever the user mentions Horizon by name in a Laravel context.
anonaddy/anonaddy
Always invoke when the user's message includes 'tailwind' in any form.
coollabsio/coolify
ACTIVATE when the user works on authentication in Laravel. An agent skill from coollabsio/coolify.
coollabsio/coolify
A skill your agent uses for Laravel MCP development. An agent skill from coollabsio/coolify.
woocommerce/woocommerce
Reviews WooCommerce code changes against the project's standards, flagging backend PHP architecture, naming, documentation, data integrity and testing violations.
symfony/symfony
Synchronize translation catalogs across maintained Symfony branches: find messages that newer branches added to the English catalogs but that are still missing from the oldest maintained branch…
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
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.
OpenLitterMap/openlittermap-web
LeaderboardController, Redis sorted sets for all-time XP rankings, per-user metrics rows for time-filtered rankings, rewardXpToAdmin, and leaderboard privacy.
Works with
AdminController, photo approval, tag editing, deletion, MetricsService integration, admin middleware, verification queue, and admin XP. Admin System is an agent skill from OpenLitterMap/openlittermap-web. AdminController, photo approval, tag editing, deletion, MetricsService integration, admin middleware, verification queue, and admin XP.
Run `npx skills add OpenLitterMap/openlittermap-web --skill admin-system -a claude-code`. Or copy the skill folder (.ai/skills/admin-system in OpenLitterMap/openlittermap-web) into .claude/skills/admin-system in your project. Claude Code loads it when a task matches its description.
Run `npx skills add OpenLitterMap/openlittermap-web --skill admin-system -a codex`. Or copy the skill folder (.ai/skills/admin-system in OpenLitterMap/openlittermap-web) into .agents/skills/admin-system 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 admin-system -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/admin-system, .gemini/skills/admin-system, .github/skills/admin-system and .opencode/skills/admin-system in your project.
SKILL.md names no scripts, command-line tools or credentials: Admin System 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.
Admin System 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 3.9k 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.
Skills that share tags, products or a category with Admin System: Configuring Horizon (coollabsio/coolify, 63k stars), Tailwindcss Development (anonaddy/anonaddy, 4.9k stars), Fortify Development (coollabsio/coolify, 63k stars) and MCP Development (coollabsio/coolify, 63k 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.