diff --git a/docs/advanced/skills.mdx b/docs/advanced/skills.mdx
index 8d9ced96..fe6316ee 100644
--- a/docs/advanced/skills.mdx
+++ b/docs/advanced/skills.mdx
@@ -71,7 +71,7 @@ Third-party service and platform security.
| Skill | Coverage |
| -------------------- | ---------------------------------- |
| `supabase` | Supabase RLS bypasses, auth issues |
-| `firebase_firestore` | Firestore rules, Firebase auth |
+| `firebase` | Firebase Firestore, Storage rules, Auth, and Functions |
### Protocols
diff --git a/strix/agents/prompts/system_prompt.jinja b/strix/agents/prompts/system_prompt.jinja
index 6af47c4e..eb5c9074 100644
--- a/strix/agents/prompts/system_prompt.jinja
+++ b/strix/agents/prompts/system_prompt.jinja
@@ -490,8 +490,10 @@ Default user: pentester (sudo available)
On-demand specialist skills. Spawn a specialist via `create_agent(skills=[...])`, or pull guidance inline for yourself via `load_skill(skills=[...])`. Anything wrapped in `` above is already loaded for you.
-{% for category, names in available_skills | dictsort -%}
-- {{ category }}: {{ names | join(', ') }}
+{% for category, skills in available_skills | dictsort -%}
+{% for skill in skills -%}
+- {{ category }}/{{ skill.name }}: {{ skill.description }}
+{% endfor -%}
{% endfor -%}
{% endif %}
diff --git a/strix/skills/__init__.py b/strix/skills/__init__.py
index 31ac3059..60a9cb1c 100644
--- a/strix/skills/__init__.py
+++ b/strix/skills/__init__.py
@@ -145,10 +145,25 @@ def _bare_skill_files(skill_name: str) -> list[Path]:
return candidates
-def get_available_skills() -> dict[str, list[str]]:
- grouped: dict[str, list[str]] = {}
+def _skill_description(file_path: Path) -> str:
+ try:
+ content = file_path.read_text(encoding="utf-8")
+ except (OSError, ValueError):
+ return ""
+ frontmatter = _FRONTMATTER_PATTERN.match(content)
+ if frontmatter is None:
+ return ""
+ match = re.search(r"^description:\s*(.+?)\s*$", frontmatter.group(0), re.MULTILINE)
+ return match.group(1).strip() if match else ""
+
+
+def get_available_skills() -> dict[str, list[dict[str, str]]]:
+ grouped: dict[str, list[dict[str, str]]] = {}
for category, name in _iter_user_skill_files():
- grouped.setdefault(category, []).append(name)
+ path = _qualified_skill_files(f"{category}/{name}")
+ grouped.setdefault(category, []).append(
+ {"name": name, "description": _skill_description(path[0]) if path else ""}
+ )
return grouped
diff --git a/strix/skills/cloud/gcp.md b/strix/skills/cloud/gcp.md
index a6f28293..2c721594 100644
--- a/strix/skills/cloud/gcp.md
+++ b/strix/skills/cloud/gcp.md
@@ -16,7 +16,7 @@ GCP misconfigurations expose project data, service account keys, and lateral mov
**Storage & Data**
- Cloud Storage (GCS) buckets and objects
-- BigQuery datasets, Cloud SQL instances, Firestore (see `firebase_firestore` skill)
+- BigQuery datasets, Cloud SQL instances, Firestore (see `firebase` skill)
- Secret Manager, Cloud KMS keys
**Compute**
diff --git a/strix/skills/technologies/firebase_firestore.md b/strix/skills/technologies/firebase.md
similarity index 64%
rename from strix/skills/technologies/firebase_firestore.md
rename to strix/skills/technologies/firebase.md
index a0c48728..7bf90232 100644
--- a/strix/skills/technologies/firebase_firestore.md
+++ b/strix/skills/technologies/firebase.md
@@ -1,9 +1,9 @@
---
-name: firebase-firestore
-description: Firebase/Firestore security testing covering security rules, Cloud Functions, and client-side trust issues
+name: firebase
+description: Firebase security testing covering Firestore, Storage rules, Realtime Database, Auth, Functions, and client-side trust issues
---
-# Firebase / Firestore
+# Firebase
Security testing for Firebase applications. Focus on Firestore/Realtime Database rules, Cloud Storage exposure, callable/onRequest Functions trusting client input, and incorrect ID token validation.
@@ -30,7 +30,17 @@ Security testing for Firebase applications. Focus on Firestore/Realtime Database
**Endpoints**
- Firestore REST: `https://firestore.googleapis.com/v1/projects//databases/(default)/documents/`
- Realtime DB: `https://.firebaseio.com/.json`
-- Storage REST: `https://storage.googleapis.com/storage/v1/b/`
+- GCS JSON API: `https://storage.googleapis.com/storage/v1/b/`
+- Firebase Storage rules API: `https://firebasestorage.googleapis.com/v0/b//o`
+
+Cloud Storage has two front doors with different authorization engines:
+
+| Front door | Authorization engine |
+| --- | --- |
+| `storage.googleapis.com//