Agent skill

Profile System

by OpenLitterMap in OpenLitterMap/openlittermap-web

ProfileController, ApiSettingsController, DeleteAccountController, user stats (Redis + MySQL fallback), LevelService, privacy toggles, account deletion with Redis cleanup, and the Profile Vue page.

GPL-3.0Auto-check passedDatabases

Install Profile System

skills CLI
$ npx skills add OpenLitterMap/openlittermap-web --skill profile-system -a claude-code

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

GitHub CLI
$ gh skill install OpenLitterMap/openlittermap-web profile-system --agent claude-code

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

Manual copy
$ git clone --depth 1 https://github.com/OpenLitterMap/openlittermap-web.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.ai/skills/profile-system .claude/skills/profile-system && rm -rf skills-src

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

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

Facts

Skill name
profile-system
GitHub stars
134
Token cost
~3.7k tokens
SKILL.md length
904 words
Files
1
Skills in repo
16
Repo updated
First seen
Licence
GPL-3.0

At a glance

ProfileController, ApiSettingsController, DeleteAccountController, user stats (Redis + MySQL fallback), LevelService, privacy toggles, account deletion with Redis cleanup, and the Profile Vue page.

  • Works in 5 steps: All profile routes use auth:sanctum. Not… → Redis-first with MySQL fallback.… → Rank from Redis ZSET with MySQL… → …
  • Databases work in your project
  • SKILL.md covers Key Files, Invariants, Routes and Patterns, plus 1 more section
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Profile System is an agent skill from OpenLitterMap/openlittermap-web. ProfileController, ApiSettingsController, DeleteAccountController, user stats (Redis + MySQL fallback), LevelService, privacy toggles, account deletion with Redis cleanup, and the Profile Vue page.

Its SKILL.md is about 3.7k 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, Vue.js, 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.

When your agent uses it

  • Databases work in your project

Example prompts

  • “/profile-system”

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. All profile routes use auth:sanctum. Not auth:api. Use actingAs($user) in tests (no guard argument).
  2. Redis-first with MySQL fallback. RedisMetricsCollector::getUserMetrics() returns Redis data; ProfileController falls back to MySQL…
  3. Rank from Redis ZSET with MySQL fallback. ZREVRANK on {g}:lb:xp; if false, count users with more XP via User::where('xp', '>'…
  4. Level updated on profile view. If $user->level != calculated, $user->save() syncs it.
  5. Settings whitelist enforced server-side. ApiSettingsController::ALLOWED_SETTINGS = ['name', 'username', 'email', 'global_flag'…

What it can do on your machine

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

  • Tool permissions

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

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are php and javascript).

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

  • Network

    No URLs in SKILL.md.

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

  • Credentials

    Names no API keys, tokens, secrets or passwords.

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

Context cost

Profile System loads about 3.7k tokens when it runs. Until then it costs about 53 tokens; SKILL.md has 904 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~53
When it runs · the whole SKILL.md, loaded when a task matches
~3.7k

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

Safety

Auto-check passed

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.

SKILL.md

The full file from OpenLitterMap/openlittermap-web at commit ac688aa, republished under its GPL-3.0 licence (© OpenLitterMap). 904 words, ~3,730 tokens.

Download SKILL.mdSave it as .claude/skills/profile-system/SKILL.md (or your agent's skills folder).
name
profile-system
description
ProfileController, ApiSettingsController, DeleteAccountController, user stats (Redis + MySQL fallback), LevelService, privacy toggles, account deletion with Redis cleanup, and the Profile Vue page.

Profile System

User profile dashboard, settings management, privacy controls, and account deletion. Stats aggregated from Redis with MySQL fallback for pre-v5 users. Fully audited for v5 — all controllers, stores, tests confirmed correct. 35 tests across 7 files. No user tag editing (admin-only). User photo delete flows call MetricsService::deletePhoto() before soft delete.

Key Files

  • app/Http/Controllers/User/ProfileController.php — Dashboard data (index), GeoJSON (geojson), CSV export (download)
  • app/Http/Controllers/ApiSettingsController.php — Privacy toggles, whitelisted setting updates, legacy key remapping
  • app/Http/Controllers/API/DeleteAccountController.php — Account deletion with Redis cleanup across all location scopes
  • app/Http/Controllers/User/UserPhotoController.php — Bulk tag, bulk delete, filter, previous custom tags
  • app/Http/Controllers/User/Photos/UsersUploadsController.php — Paginated photo listing with v5 tag structure
  • app/Services/LevelService.php — XP-threshold based levels (12 levels, config-driven via config/levels.php)
  • app/Services/Redis/RedisMetricsCollector.php — getUserMetrics() returns uploads/xp/litter/streak from Redis
  • app/Services/Redis/RedisKeys.php — Cluster-safe key generation for all scopes
  • resources/js/stores/profile.js — Pinia store: FETCH_PROFILE() from /api/user/profile/index
  • resources/js/stores/settings.js — Pinia store: UPDATE_SETTING, TOGGLE_PRIVACY, DELETE_ACCOUNT
  • resources/js/views/Profile/Profile.vue — Tab container (Dashboard, Photos, Settings) with query-param routing
  • resources/js/views/Profile/components/ProfileDashboard.vue — Level card, stats grid, rank, achievements, locations, team
  • resources/js/views/Profile/components/ProfilePhotos.vue — Upload count, links to /uploads, /upload, /tag
  • resources/js/views/Profile/components/ProfileSettings.vue — Account fields, preference toggles, privacy toggles, delete account
  • resources/js/views/Profile/components/SettingsField.vue — Inline-editable text field with save/cancel
  • resources/js/views/Profile/components/SettingsToggle.vue — Toggle switch component
  • tests/Feature/User/ProfileIndexTest.php — 4 tests (structure, auth, location counts, rank total)
  • tests/Feature/User/PublicProfileTest.php — 4 tests (public profile data, private returns, privacy settings, 404)
  • tests/Feature/User/ProfileGeojsonTest.php — 1 test (geojson returns only admin-approved photos, uses summary JSON not result_string)
  • tests/Feature/User/SettingsProfileTest.php — 10 tests (whitelist, validation, legacy remapping, old routes)
  • tests/Feature/User/DeleteAccountTest.php — 4 tests (Redis cleanup, photo preservation, password validation)
  • tests/Feature/User/UserPhotoBulkDeleteTest.php — 5 tests (soft-delete, counters, ownership, metrics, selectAll)
  • tests/Feature/Photos/WebDeletePhotoTest.php — 5 tests (single delete, ownership, counters, metrics reversal)

Invariants

  1. All profile routes use auth:sanctum. Not auth:api. Use actingAs($user) in tests (no guard argument).
  2. Redis-first with MySQL fallback. RedisMetricsCollector::getUserMetrics() returns Redis data; ProfileController falls back to MySQL. resolveUserStats() batches the DB fallback into a single selectRaw('COUNT(*), SUM(total_tags)') query. Litter stat falls back to Photo::sum('total_tags') (not deprecated users.total_litter).
  3. Rank from Redis ZSET with MySQL fallback. ZREVRANK on {g}:lb:xp; if false, count users with more XP via User::where('xp', '>', $xp)->count() + 1.
  4. Level updated on profile view. If $user->level != calculated, $user->save() syncs it.
  5. Settings whitelist enforced server-side. ApiSettingsController::ALLOWED_SETTINGS = ['name', 'username', 'email', 'global_flag', 'picked_up', 'previous_tags', 'emailsub', 'public_profile']. Any other key returns 422. 5a. users.public_photos controls upload visibility default. Boolean, default true. New uploads inherit this value unless overridden by an explicit request param. School team uploads always override to false regardless. Updated via the settings system. Own-user photo queries (e.g. GET /api/v3/user/photos) include all photos regardless of is_public — the user sees their own private photos.
  6. Legacy key remapping. items_remaining → picked_up with inverted boolean (backward compat for old mobile clients).
  7. Photos preserved on account deletion. User hard-deleted, photos remain (public contribution to map).
  8. Redis cleanup is comprehensive. Removes user from XP and contributor rankings for every location scope (global, country, state, city), plus user stats hash, tags hash, and streak bitmap.
  9. Privacy toggles are boolean columns. show_name_maps, show_username_maps, show_name_createdby, show_username_createdby on User model. Controllers toggle and return new value.
  10. Photo deletion reverses metrics. MetricsService::deletePhoto() called for processed photos before soft-delete. Decrements user.xp and user.total_images.
  11. GeoJSON uses summary JSON, not result_string. ProfileController@geojson returns properties.summary (v5 JSON array), not properties.result_string (deprecated v4 string). Frontend popup.js expects summary.

Routes

SPA routes — auth:sanctum (session cookies + Sanctum tokens)
# Profile dashboard
GET    /api/user/profile/index                    → ProfileController@index
GET    /api/user/profile/map                      → ProfileController@geojson
GET    /api/user/profile/download                 → ProfileController@download

# Photo management (SPA)
GET    /api/user/profile/photos/index             → UserPhotoController@index
GET    /api/user/profile/photos/filter            → UserPhotoController@filter
POST   /api/user/profile/photos/tags/bulkTag      → UserPhotoController@bulkTag
POST   /api/user/profile/photos/delete            → UserPhotoController@destroy

# Single-photo delete (SPA legacy route, also auth:sanctum)
POST   /api/profile/photos/delete                 → PhotosController@deleteImage

# Settings (SPA — new endpoints)
POST   /api/settings/update                       → ApiSettingsController@update
POST   /api/settings/delete-account               → DeleteAccountController

# Privacy toggles (SPA)
POST   /api/settings/privacy/maps/name            → ApiSettingsController@mapsName
POST   /api/settings/privacy/maps/username        → ApiSettingsController@mapsUsername
POST   /api/settings/privacy/leaderboard/name     → ApiSettingsController@leaderboardName
POST   /api/settings/privacy/leaderboard/username  → ApiSettingsController@leaderboardUsername
POST   /api/settings/privacy/createdby/name       → ApiSettingsController@createdByName
POST   /api/settings/privacy/createdby/username    → ApiSettingsController@createdByUsername
POST   /api/settings/privacy/toggle-previous-tags  → ApiSettingsController@togglePreviousTags
Legacy mobile routes — auth:api (Passport tokens)
# Settings (mobile — legacy endpoints, separate from SPA)
POST   /api/settings/details                      → UsersController@details
PATCH  /api/settings/details/password             → UsersController@changePassword
POST   /api/settings/privacy/update               → UsersController@togglePrivacy
POST   /api/settings/phone/submit                 → UsersController@phone
POST   /api/settings/phone/remove                 → UsersController@removePhone
POST   /api/settings/toggle                       → UsersController@togglePresence
POST   /api/settings/email/toggle                 → EmailSubController@toggleEmailSub
GET    /api/settings/flags/countries              → SettingsController@getCountries
POST   /api/settings/save-flag                    → SettingsController@saveFlag
PATCH  /api/settings                              → SettingsController@update

# Photo delete (mobile)
DELETE /api/photos/delete                         → ApiPhotosController@deleteImage
v3 routes — auth:api,web (both guards)
GET    /api/v3/user/photos                        → UsersUploadsController@index
GET    /api/v3/user/photos/stats                  → UsersUploadsController@stats
PATCH  /api/v3/photos/{id}/visibility             → PhotoVisibilityController (or inline)
                                                     Owner only. Blocked for school team photos (403).
                                                     Toggles is_public per-photo. Triggers dirty tile marking via PhotoObserver.

Patterns

ProfileController@index response
php
return [
    'user' => [id, name, username, avatar, created_at, member_since, global_flag, public_profile],
    'stats' => [uploads, litter, xp, streak, littercoin, photo_percent, tag_percent],
    'level' => [level, title, xp_into_level, xp_for_next, xp_remaining, progress_percent],
    'rank' => [global_position, global_total, percentile],
    'achievements' => [unlocked, total],
    'locations' => [countries, states, cities],
    'global_stats' => [total_photos, total_tags],
    'team' => [id, name] | null,
];
Show full SKILL.md (366 more words)Show less
Caching
  • Global stats cached 5 min (profile:global_stats) — from metrics aggregate row (user_id=0)
  • Location counts cached 5 min (profile:{userId}:locations:{photoCount}) — keyed by photo count for auto-invalidation on upload
  • Public profile location counts cached 5 min (profile:{id}:public_locations:{photoCount})
  • Rank uses Redis ZREVRANK (O(log n)), MySQL fallback only when user not in ZSET
  • User count cached 1 hour (users:count)
  • Achievements count cached 1 hour (achievements:count)
Redis + MySQL fallback pattern
php
$metrics = RedisMetricsCollector::getUserMetrics($userId);
// resolveUserStats() uses metrics table first, falls back to Redis, then DB
$metricsRow = DB::table('metrics')->where(...)->first(['uploads', 'tags', 'xp']);
$uploads = (int) ($metricsRow->uploads ?? 0) ?: $redisMetrics['uploads'] ?: Photo::count();
$xp = (int) ($metricsRow->xp ?? 0) ?: $redisMetrics['xp'] ?: (int) $user->xp;
Rank calculation
php
$globalXpKey = RedisKeys::xpRanking(RedisKeys::global());
$rank = Redis::zRevRank($globalXpKey, (string) $userId);
if ($rank !== false) {
    $globalPosition = $rank + 1; // 0-indexed → 1-indexed
} else {
    $globalPosition = User::where('xp', '>', $xp)->count() + 1;
}
Level progression (config-driven thresholds)
Level 1:  0 XP       — Noob
Level 2:  100 XP     — Litter Picker
Level 3:  1000 XP    — Litter Wizard
Level 4:  5000 XP    — Trash Warrior
Level 5:  10000 XP   — Early Guardian
...
Level 11: 1000000 XP — SuperIntelligent LitterMaster

Config: config/levels.php. Service: LevelService::getUserLevel($xp) returns level info array. User model next_level accessor calls LevelService.

Account deletion Redis cleanup
php
// Determine all location scopes from user's photos
$photos = Photo::where('user_id', $userId)->get();
$scopes = [RedisKeys::global()];
foreach ($photos as $photo) {
    if ($photo->country_id) $scopes[] = RedisKeys::country($photo->country_id);
    if ($photo->state_id)   $scopes[] = RedisKeys::state($photo->state_id);
    if ($photo->city_id)    $scopes[] = RedisKeys::city($photo->city_id);
}
$scopes = array_unique($scopes);

// Remove from all ranking ZSETs
foreach ($scopes as $scope) {
    Redis::zRem(RedisKeys::xpRanking($scope), (string) $userId);
    Redis::zRem(RedisKeys::contributorRanking($scope), (string) $userId);
}

// Delete user-specific keys
$userScope = RedisKeys::user($userId);
Redis::del(RedisKeys::stats($userScope));
Redis::del("{$userScope}:tags");
Redis::del(RedisKeys::userBitmap($userId));
Frontend tab routing
javascript
// Profile.vue uses query params for tab persistence
const route = useRoute();
const router = useRouter();
const activeTab = computed(() => route.query.tab || 'dashboard');

function switchTab(tab) {
    router.replace({ query: { tab } });
}
Settings store sync pattern
javascript
// settings.js syncs back to userStore after update
async UPDATE_SETTING(key, value) {
    const { data } = await axios.post('/api/settings/update', { key, value });
    if (data.success) {
        const userStore = useUserStore();
        if (userStore.user[key] !== undefined) {
            userStore.user[key] = value;
        }
    }
}

Common Mistakes

  • Mixing up SPA vs mobile auth guards. SPA profile/settings routes use auth:sanctum (session cookies). Legacy mobile routes use auth:api (Passport tokens). They are separate route groups — don't merge them. Sanctum does NOT validate Passport tokens.
  • Using Auth::guard('api')->user() in SPA controllers. Use Auth::user() — Sanctum resolves the user from session or token automatically. Auth::guard('api') returns null for session-authenticated SPA users.
  • Using actingAs($user, 'api') in tests for SPA routes. SPA routes use auth:sanctum. Use actingAs($user) with no guard argument. Using 'api' guard in test + auth:sanctum on route = 401.
  • Uploading via /api/photos/submit in web-guard tests. That route uses auth:api (Passport). If your test uses actingAs($user) (web guard), the upload silently fails. Use Photo::factory() to create test photos instead.
  • Not falling back to MySQL for pre-v5 users. Redis stats hash is empty for users who uploaded before v5. Always check $metrics['uploads'] ?: (int) $user->total_images.
  • Comparing level with wrong XP. Levels are threshold-based (not cumulative): 0, 100, 1000, 5000, etc. Use LevelService::getUserLevel(), don't calculate manually.
  • Forgetting ZREVRANK returns false not null. PHP Redis returns false for missing members. Check $rank !== false.
  • Hard-deleting photos on account deletion. Photos are public contributions and must be preserved. Only the User record is hard-deleted.
  • Allowing mass assignment of protected fields. is_admin, verification_required, etc. are NOT in ALLOWED_SETTINGS. The whitelist check prevents privilege escalation.
  • Not reversing metrics on photo deletion. MetricsService::deletePhoto() must run for processed photos (those with processed_at) before soft-delete.
  • Forgetting inverted boolean for picked_up. Mobile sends picked_up=false meaning items_remaining=true. The controller inverts the value.
  • Adding constructor middleware to controllers in auth:sanctum route groups. Route group handles auth — constructor $this->middleware('auth') is redundant and can conflict. PhotosController had this bug (fixed).

© 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

Files

Just SKILL.md in .ai/skills/profile-system of OpenLitterMap/openlittermap-web.

Open the folder on GitHubat commit ac688aa

Compare with similar skills

Profile 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.

Profile System compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Profile System this skillOpenLitterMap/openlittermap-web134—~3.7kAutomated safety check: PassGPL-3.0
Alsacreations Guidelinesalsacreations/kiwipedia338—~900Automated safety check: PassNone
Email Blastantiwork/gumroad9.8k—~1.4kAutomated safety check: PassMIT
Ant Design Vue UIlazzyfu/goInsight730—~2kAutomated safety check: PassMIT
Tgf Server Devthkhxm/tgf128—~1.3kAutomated safety check: NotesMIT
Abp Pro InfrastructureWangJunZzz/abp-vnext-pro860—~258Automated safety check: PassMIT

Similar skills

  • Alsacreations Guidelines

    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…

    338 GitHub stars~900 tokensUpdated 18 days ago
    DatabasesAuto-check passed
  • Email Blast

    antiwork/gumroad

    Send one-off email blasts to Gumroad creators directly via production console, no PR or deploy needed.

    9.8k GitHub stars~1.4k tokensUpdated today
    DatabasesAuto-check passed
  • Ant Design Vue UI

    lazzyfu/goInsight

    Build, refactor, or review production-grade admin interfaces with Vue 3 + JavaScript + Ant Design Vue 4.x.

    730 GitHub stars~2k tokensUpdated 6 mo ago
    DatabasesAuto-check passed
  • Tgf Server Dev

    thkhxm/tgf

    基于 tgf v2(github.com/thkhxm/tgf/v2)用确定性的 tgfctl 工作流创建、验证和维护 Go 游戏服务器项目。

    128 GitHub stars~1.3k tokensUpdated 2 mo ago
    DatabasesAuto-check: notes
  • Abp Pro Infrastructure

    WangJunZzz/abp-vnext-pro

    本项目的基础设施集成规则。修改 CAP 分布式事件、Hangfire、Redis、SignalR、后台任务、租户传播、事务 Outbox 或 Host 集成时使用。

    860 GitHub stars~258 tokensUpdated 1 mo ago
    DatabasesAuto-check passed
  • Cache Debug

    zhyese/grid-qa

    排查问答缓存问题(不命中/脏缓存/黑名单误拦/置信度过滤/多轮不缓存)时使用。覆盖三级缓存(Redis/MySQL/Semantic)+黑名单+置信度规则。

    144 GitHub stars~646 tokensUpdated 3 days ago
    DatabasesAuto-check passed

More from OpenLitterMap/openlittermap-web

All 16 skills in this repo
  • Tailwindcss Development

    OpenLitterMap/openlittermap-web

    Styles applications using Tailwind CSS v3 utilities. An agent skill from OpenLitterMap/openlittermap-web.

    134 GitHub stars~713 tokensUpdated 23 days ago
    Auto-check passed
  • Olm Architecture

    OpenLitterMap/openlittermap-web

    OpenLitterMap v5 architecture reference. An agent skill from OpenLitterMap/openlittermap-web.

    134 GitHub stars~5.2k tokensUpdated 23 days ago
    Auto-check passed
  • Achievements System

    OpenLitterMap/openlittermap-web

    AchievementEngine, AchievementRepository, milestone checkers, AchievementsSeeder, userachievements pivot, AchievementsController API, and achievement evaluation flow.

    134 GitHub stars~1.4k tokensUpdated 23 days ago
    Auto-check passed
  • Admin System

    OpenLitterMap/openlittermap-web

    AdminController, photo approval, tag editing, deletion, MetricsService integration, admin middleware, verification queue, and admin XP.

    134 GitHub stars~3.9k tokensUpdated 23 days ago
    Auto-check passed
  • API Endpoints

    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.

    134 GitHub stars~4k tokensUpdated 23 days ago
    Auto-check passed
  • Clustering System

    OpenLitterMap/openlittermap-web

    ClusteringService, tile keys, dirty tiles/teams, clustering commands, ClusterController GeoJSON API, PhotoObserver dirty marking, and map cluster rendering.

    134 GitHub stars~2k tokensUpdated 23 days ago
    Auto-check passed

Categories

Questions about Profile System

What does Profile System do?

ProfileController, ApiSettingsController, DeleteAccountController, user stats (Redis + MySQL fallback), LevelService, privacy toggles, account deletion with Redis cleanup, and the Profile Vue page. Profile System is an agent skill from OpenLitterMap/openlittermap-web. ProfileController, ApiSettingsController, DeleteAccountController, user stats (Redis + MySQL fallback), LevelService, privacy toggles, account deletion with Redis cleanup, and the Profile Vue page.

When should I use Profile System?

Profile System fits situations like: databases work in your project.

How do I install Profile System in Claude Code?

Run `npx skills add OpenLitterMap/openlittermap-web --skill profile-system -a claude-code`. Or copy the skill folder (.ai/skills/profile-system in OpenLitterMap/openlittermap-web) into .claude/skills/profile-system in your project. Claude Code loads it when a task matches its description.

How do I install Profile System in Codex?

Run `npx skills add OpenLitterMap/openlittermap-web --skill profile-system -a codex`. Or copy the skill folder (.ai/skills/profile-system in OpenLitterMap/openlittermap-web) into .agents/skills/profile-system in your project. Codex loads it when a task matches its description.

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

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add OpenLitterMap/openlittermap-web --skill profile-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/profile-system, .gemini/skills/profile-system, .github/skills/profile-system and .opencode/skills/profile-system in your project.

What does Profile System need to run?

SKILL.md names no scripts, command-line tools or credentials: Profile System is instructions for the agent only.

Does Profile System access the network?

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.

Is Profile System safe to install?

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.

What licence does Profile System use?

Profile 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.

How many tokens does Profile System use?

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.

What are the alternatives to Profile System?

Skills that share tags, products or a category with Profile System: Alsacreations Guidelines (alsacreations/kiwipedia, 338 stars), Email Blast (antiwork/gumroad, 9.8k stars), Ant Design Vue UI (lazzyfu/goInsight, 730 stars) and Tgf Server Dev (thkhxm/tgf, 128 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Profile System?

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.