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…
ProfileController, ApiSettingsController, DeleteAccountController, user stats (Redis + MySQL fallback), LevelService, privacy toggles, account deletion with Redis cleanup, and the Profile Vue page.
$ npx skills add OpenLitterMap/openlittermap-web --skill profile-system -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install OpenLitterMap/openlittermap-web profile-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/profile-system .claude/skills/profile-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 "profile-system" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/profile-system into .claude/skills/profile-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "profile-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/profile-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 profile-system -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install OpenLitterMap/openlittermap-web profile-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/profile-system .agents/skills/profile-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 "profile-system" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/profile-system into .agents/skills/profile-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "profile-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 profile-system -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install OpenLitterMap/openlittermap-web profile-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/profile-system .cursor/skills/profile-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 "profile-system" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/profile-system into .cursor/skills/profile-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "profile-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/profile-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 profile-system -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install OpenLitterMap/openlittermap-web profile-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/profile-system .gemini/skills/profile-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 "profile-system" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/profile-system into .gemini/skills/profile-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "profile-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 profile-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 profile-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/profile-system .github/skills/profile-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 "profile-system" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/profile-system into .github/skills/profile-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "profile-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 profile-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 profile-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/profile-system .opencode/skills/profile-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 "profile-system" agent skill from https://github.com/OpenLitterMap/openlittermap-web/tree/master/.ai/skills/profile-system into .opencode/skills/profile-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "profile-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.
profile-systemProfileController, 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.
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.
5 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 and javascript).
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.
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.
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). 904 words, ~3,730 tokens.
.claude/skills/profile-system/SKILL.md (or your agent's skills folder).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.
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 remappingapp/Http/Controllers/API/DeleteAccountController.php — Account deletion with Redis cleanup across all location scopesapp/Http/Controllers/User/UserPhotoController.php — Bulk tag, bulk delete, filter, previous custom tagsapp/Http/Controllers/User/Photos/UsersUploadsController.php — Paginated photo listing with v5 tag structureapp/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 Redisapp/Services/Redis/RedisKeys.php — Cluster-safe key generation for all scopesresources/js/stores/profile.js — Pinia store: FETCH_PROFILE() from /api/user/profile/indexresources/js/stores/settings.js — Pinia store: UPDATE_SETTING, TOGGLE_PRIVACY, DELETE_ACCOUNTresources/js/views/Profile/Profile.vue — Tab container (Dashboard, Photos, Settings) with query-param routingresources/js/views/Profile/components/ProfileDashboard.vue — Level card, stats grid, rank, achievements, locations, teamresources/js/views/Profile/components/ProfilePhotos.vue — Upload count, links to /uploads, /upload, /tagresources/js/views/Profile/components/ProfileSettings.vue — Account fields, preference toggles, privacy toggles, delete accountresources/js/views/Profile/components/SettingsField.vue — Inline-editable text field with save/cancelresources/js/views/Profile/components/SettingsToggle.vue — Toggle switch componenttests/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)auth:sanctum. Not auth:api. Use actingAs($user) in tests (no guard argument).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).ZREVRANK on {g}:lb:xp; if false, count users with more XP via User::where('xp', '>', $xp)->count() + 1.$user->level != calculated, $user->save() syncs it.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.items_remaining → picked_up with inverted boolean (backward compat for old mobile clients).show_name_maps, show_username_maps, show_name_createdby, show_username_createdby on User model. Controllers toggle and return new value.MetricsService::deletePhoto() called for processed photos before soft-delete. Decrements user.xp and user.total_images.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.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@togglePreviousTagsauth: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@deleteImageauth: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.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,
];profile:global_stats) — from metrics aggregate row (user_id=0)profile:{userId}:locations:{photoCount}) — keyed by photo count for auto-invalidation on uploadprofile:{id}:public_locations:{photoCount})users:count)achievements:count)$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;$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 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 LitterMasterConfig: config/levels.php. Service: LevelService::getUserLevel($xp) returns level info array. User model next_level accessor calls LevelService.
// 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));// 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.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;
}
}
}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.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.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./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.$metrics['uploads'] ?: (int) $user->total_images.LevelService::getUserLevel(), don't calculate manually.ZREVRANK returns false not null. PHP Redis returns false for missing members. Check $rank !== false.is_admin, verification_required, etc. are NOT in ALLOWED_SETTINGS. The whitelist check prevents privilege escalation.MetricsService::deletePhoto() must run for processed photos (those with processed_at) before soft-delete.picked_up. Mobile sends picked_up=false meaning items_remaining=true. The controller inverts the value.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
Just SKILL.md in .ai/skills/profile-system of OpenLitterMap/openlittermap-web.
Open the folder on GitHubat commit ac688aa
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Profile System this skillOpenLitterMap/openlittermap-web | 134 | — | ~3.7k | Automated safety check: Pass | GPL-3.0 | |
| Alsacreations Guidelinesalsacreations/kiwipedia | 338 | — | ~900 | Automated safety check: Pass | None | |
| Email Blastantiwork/gumroad | 9.8k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Ant Design Vue UIlazzyfu/goInsight | 730 | — | ~2k | Automated safety check: Pass | MIT | |
| Tgf Server Devthkhxm/tgf | 128 | — | ~1.3k | Automated safety check: Notes | MIT | |
| Abp Pro InfrastructureWangJunZzz/abp-vnext-pro | 860 | — | ~258 | Automated safety check: Pass | MIT |
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…
antiwork/gumroad
Send one-off email blasts to Gumroad creators directly via production console, no PR or deploy needed.
lazzyfu/goInsight
Build, refactor, or review production-grade admin interfaces with Vue 3 + JavaScript + Ant Design Vue 4.x.
thkhxm/tgf
基于 tgf v2(github.com/thkhxm/tgf/v2)用确定性的 tgfctl 工作流创建、验证和维护 Go 游戏服务器项目。
WangJunZzz/abp-vnext-pro
本项目的基础设施集成规则。修改 CAP 分布式事件、Hangfire、Redis、SignalR、后台任务、租户传播、事务 Outbox 或 Host 集成时使用。
zhyese/grid-qa
排查问答缓存问题(不命中/脏缓存/黑名单误拦/置信度过滤/多轮不缓存)时使用。覆盖三级缓存(Redis/MySQL/Semantic)+黑名单+置信度规则。
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
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.
Profile System fits situations like: databases work in your project.
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.
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.
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.
SKILL.md names no scripts, command-line tools or credentials: Profile 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.
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.
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.
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.
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.