No description
- TypeScript 41.5%
- Astro 30.6%
- Python 21.8%
- CSS 3%
- HTML 2.4%
- Other 0.6%
- feat(map): contraste markers gatherables (skillpoint plant + co.) sur basemap parchemin - chore(map): catégorie "Gisements / Ore deposits" en WIP (couche cachée le temps de fiabiliser la data voxel) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .forgejo/workflows | ||
| .husky | ||
| backend | ||
| docs | ||
| frontend | ||
| shared | ||
| tools/scraper | ||
| .env.example | ||
| .gitignore | ||
| CONTRIBUTING.md | ||
| docker-compose.yml | ||
| LICENSE | ||
| Makefile | ||
| NOTICE.md | ||
| README.md | ||
| REPORT-2026-05-10.md | ||
ShroudedTools
Bilingual (FR/EN) community website for the game Enshrouded. Open-source under AGPL-3.0.
Live: https://shrouded.tools
Tools
- ✅ Build Planner — skill tree + 9-slot gear loadout, multi-save localStorage, share via short URL or
?gear=hash. - ✅ Calculator — damage simulator with gear loadout + skill build import, weapon/target cross-link to wiki.
- ✅ Carte / Map — Leaflet image map with 1300+ markers, GeoIP filters, day/night themes.
- ✅ Wiki — 8 entity types with cross-refs (items, recipes, bestiary, npcs, perks, quests, lore, chests).
- ✅ Admin — audience analytics (anonymous, no cookie/tracker), feedback inbox, revisions queue.
Local development
make dev # start the full stack (pg + redis + backend + frontend)
make test # run all tests
make migrate # apply DB migrations
See docs/architecture.md for the design and docs/contributing.md to contribute.
Security
Operating modes adopted across phases 1–6 of the 2026-05-12 security audit:
- Rate limiting :
slowapi+ redis storage on/auth/login(5/15min),/auth/setup(3/h),/feedback(30/h); nginxlimit_req_zoneas the first line of defence (cf.app/core/rate_limit.py). - HTML sanitization : every game-data i18n string (
description_i18n,name_i18n) goes throughnh3at write time (backend/app/core/sanitize.py); the frontend<SafeHtml>component (frontend/src/lib/safe-html.tsx) renders only an allowlisted tag set (<b>,<i>,<em>,<strong>,<br>,<p>,<color>,<npc>). - Constant-time auth : login always runs an Argon2 verify, even when the email lookup misses (defeats timing-based user enumeration).
- Role split :
require_admin(admin only — tokens, scraper, analytics) vsrequire_editor(admin or editor — catalog/feedback/revisions). Don't mix the two when adding new admin endpoints. - Schemas with
extra=forbid: every catalog*Inschema rejects unknown keys; prevents mass-assignment viasetattrin revisions. - Anonymous analytics : nginx access logs → backend SQLite (
/data/analytics.sqlite). IP+UA hashed withANALYTICS_SALT_SECRET(dedicated, NOTSESSION_SECRET) + UTC date, rotated daily. No cookie, no JS tracker. - Security headers :
SecurityHeadersMiddlewaresets CSP / XFO / Referrer-Policy / Permissions-Policy / HSTS on every response (independent of nginx). Seebackend/app/core/security_headers.py. - Container hardening : prod compose runs frontend + backend with
read_only: true,cap_drop: [ALL],no-new-privileges,tmpfs:for/tmponly. Postgres + Redis pinned by digest. /.well-known/security.txt: RFC 9116 contact + expiry. Update before 2027-05-12.
Disclosure: timothy@greil.fr (PGP TBD).
License
AGPL-3.0 — see LICENSE.