Assistant
Here's your full list of **74 skills** organized by category:
---
### 🤖 Autonomous AI Agents (4)
- claude-code — Delegate coding to Claude Code CLI
- codex — Delegate coding to OpenAI Codex CLI
- hermes-agent — Configure/extend/contribute to Hermes Agent
- opencode — Delegate coding to OpenCode CLI
### 🎨 Creative (18)
- architecture-diagram — Dark-themed SVG architecture/cloud diagrams
- ascii-art — pyfiglet, cowsay, image-to-ascii
- ascii-video — Convert video/audio to colored ASCII MP4/GIF
- baoyu-infographic — Infographics: 21 layouts × 21 styles
- claude-design — Design one-off HTML artifacts
- comfyui — Generate images, video, audio with ComfyUI
- design-md — Author/validate Google DESIGN.md files
- excalidraw — Hand-drawn Excalidraw JSON diagrams
- humanizer — Humanize text, strip AI-isms
- manim-video — Manim CE math/algo animations
- p5js — p5.js sketches: gen art, shaders, interactive, 3D
- popular-web-designs — 54 real design systems as HTML/CSS
- pretext — Creative browser demos with @chenglou/pretext
- sketch — Throwaway HTML mockups: 2-3 variants
- songwriting-and-ai-music — Songwriting craft + Suno AI prompts
- touchdesigner-mcp — Control TouchDesigner via MCP
### 📊 Data Science (1)
- jupyter-live-kernel — Iterative Python via live Jupyter kernel
### 🔧 DevOps (1)
- chat-bridge — Cross-platform chat bridge (Discord + Telegram)
### 📧 Email (1)
- himalaya — IMAP/SMTP email from terminal
### 🐙 GitHub (6)
- codebase-inspection — Inspect codebases w/ pygount
- github-auth — GitHub auth setup
- github-code-review — Review PRs: diffs, inline comments
- github-issues — Create/triage/label/assign issues
- github-pr-workflow — GitHub PR lifecycle
- github-repo-management — Clone/create/fork repos
### 🎬 Media (4)
- gif-search — Search/download GIFs from Tenor
- heartmula — Suno-like song generation from lyrics + tags
- songsee — Audio spectrograms/features via CLI
- youtube-content — YouTube transcripts to summaries
### 🧠 MLOps (7)
- audiocraft-audio-generation — MusicGen text-to-music/sound
- evaluating-llms-harness — Benchmark LLMs (MMLU, GSM8K, etc.)
- huggingface-hub — HuggingFace hf CLI
- llama-cpp — llama.cpp local GGUF inference
- segment-anything-model — SAM zero-shot image segmentation
- serving-llms-vllm — vLLM high-throughput LLM serving
- weights-and-biases — W&B experiment tracking
### 📝 Note Taking (1)
- obsidian — Read/search/create/edit Obsidian notes
### 📋 Productivity (8)
- airtable — Airtable REST API via curl
- google-workspace — Gmail, Calendar, Drive, Docs, Sheets
- maps — Geocode, POIs, routes via OSM/OSRM
- nano-pdf — Edit PDF text/typos/titles
- notion — Notion API + ntn CLI
- ocr-and-documents — Extract text from PDFs/scans
- powerpoint — Create/read/edit .pptx decks
- teams-meeting-pipeline — Teams meeting summary pipeline
### 🔍 Research (7)
- arxiv — Search arXiv papers
- blogwatcher — Monitor blogs and RSS feeds
- llm-wiki — Karpathy's LLM Wiki
- osint-aggregate — Aggregate OSINT data across multiple sources
- osint-investigation — Public-records OSINT investigation framework
- polymarket — Query Polymarket markets
- research-paper-writing — Write ML papers for NeurIPS/ICML/ICLR
### 🔒 Security (1)
- sherlock — OSINT username search across 400+ social networks
### 🏠 Smart Home (1)
- openhue — Control Philips Hue lights via OpenHue CLI
### 🐦 Social Media (1)
- xurl — X/Twitter via xurl CLI
### 💻 Software Development (9)
- hermes-agent-skill-authoring — Author in-repo SKILL.md
- hermes-user-skills — Install/configure user-local skills
- node-inspect-debugger — Debug Node.js via Chrome DevTools
- plan — Plan mode: write actionable markdown plans
- python-debugpy — Debug Python: pdb REPL + debugpy
- requesting-code-review — Pre-commit review: security scan
- simplify-code — Parallel 3-agent cleanup of code changes
- spike — Throwaway experiments to validate ideas
- systematic-debugging — 4-phase root cause debugging
- test-driven-development — TDD: RED-GREEN-REFACTOR
---
### 🔎 Regarding location:
There's no dedicated "location" skill, but these are relevant:
- **maps** — Geocoding, POIs, routes via OpenStreetMap/OSRM
- **osint-aggregate** — Can aggregate location-related OSINT data
- **osint-investigation** — Public-records investigations (property records, etc.)
And of course your custom location service is already running at location.teksploits.com — that's a Flask app you built separately, not a Hermes skill.
Want me to dive into any of these skills, or create a new one for location-related tasks?
Assistant
{"content": "1|#!/usr/bin/env python3\n2|\"\"\"Location Service — collect GPS + cellular data from browser devices.\"\"\"\n3|\n4|import json\n5|import sqlite3\n6|import os\n7|from datetime import datetime, timezone\n8|from pathlib import Path\n9|from flask import Flask, render_template, request, jsonify\n10|\n11|app = Flask(__name__)\n12|\n13|DB_PATH = Path(__file__).parent / \"locations.db\"\n14|\n15|\n16|def get_db():\n17| conn = str(DB_PATH)\n18| db = sqlite3.connect(conn)\n19| db.row_factory = sqlite3.Row\n20| db.execute(\"\"\"\n21| CREATE TABLE IF NOT EXISTS device_reports (\n22| id INTEGER PRIMARY KEY AUTOINCREMENT,\n23| device_id TEXT,\n24| device_name TEXT,\n25| user_agent TEXT,\n26| ip_addr TEXT,\n27| reported_at TEXT,\n28| gps_lat REAL,\n29| gps_lon REAL,\n30| gps_accuracy REAL,\n31| gps_altitude REAL,\n32| gps_alt_accuracy REAL,\n33| gps_speed REAL,\n34| gps_heading REAL,\n35| gps_timestamp TEXT,\n36| cell_type TEXT,\n37| cell_effective_type TEXT,\n38| cell_downlink REAL,\n39| cell_rtt INTEGER,\n40| cell_downlink_max REAL,\n41| cell_save_data INTEGER,\n42| connection_info_raw TEXT,\n43| extra_json TEXT\n44| )\n45| \"\"\")\n46| db.execute(\"\"\"\n47| CREATE TABLE IF NOT EXISTS wifi_reports (\n48| id INTEGER PRIMARY KEY AUTOINCREMENT,\n49| report_id INTEGER,\n50| ssid TEXT,\n51| bssid TEXT,\n52| frequency REAL,\n53| signal_level INTEGER,\n54| ip_addr TEXT,\n55| timestamp TEXT,\n56| FOREIGN KEY (report_id) REFERENCES device_reports(id)\n57| )\n58| \"\"\")\n59| db.commit()\n60| return db\n61|\n62|\n63|@app.route(\"/\")\n64|def index():\n65| \"\"\"Main page — location collector UI.\"\"\"\n66| return render_template(\"index.html\")\n67|\n68|\n69|@app.route(\"/api/report\", methods=[\"POST\"])\n70|def report_location():\n71| \"\"\"Receive a location + cell data report from a browser.\"\"\"\n72| db = get_db()\n73| body = request.get_json(force=True, silent=True) or {}\n74|\n75| gps = body.get(\"geolocation\") or {}\n76| conn_info = body.get(\"connection\") or {}\n77| extra = body.get(\"extra\") or {}\n78|\n79| cursor = db.execute(\n80| \"\"\"INSERT INTO device_reports\n81| (device_id, device_name, user_agent, ip_addr, reported_at,\n82| gps_lat, gps_lon, gps_accuracy, gps_altitude, gps_alt_accuracy,\n83| gps_speed, gps_heading, gps_timestamp,\n84| cell_type, cell_effective_type, cell_downlink, cell_rtt,\n85| cell_downlink_max, cell_save_data, connection_info_raw, extra_json)\n86| VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\"\"\",\n87| (\n88| body.get(\"deviceId\", \"\"),\n89| body.get(\"deviceName\", \"\"),\n90| request.headers.get(\"User-Agent\", \"\")[:500],\n91| request.remote_addr or \"\",\n92| datetime.now(timezone.utc).isoformat(),\n93| gps.get(\"latitude\"),\n94| gps.get(\"longitude\"),\n95| gps.get(\"accuracy\"),\n96| gps.get(\"altitude\"),\n97| gps.get(\"altitudeAccuracy\"),\n98| gps.get(\"speed\"),\n99| gps.get(\"heading\"),\n100| gps.get(\"timestamp\"),\n101| conn_info.get(\"type\"),\n102| conn_info.get(\"effectiveType\"),\n103| conn_info.get(\"downlink\"),\n104| conn_info.get(\"rtt\"),\n105| conn_info.get(\"downlinkMax\"),\n106| 1 if conn_info.get(\"saveData\") else 0,\n107| json.dumps(conn_info),\n108| json.dumps(extra) if extra else None,\n109| ),\n110| )\n111|\n112| report_id = cursor.lastrowid\n113|\n114| # Save WiFi info if provided\n115| wifi_list = body.get(\"wifi\") or []\n116| for w in wifi_list:\n117| db.execute(\n118| \"INSERT INTO wifi_reports (report_id, ssid, bssid, frequency, signal_level, ip_addr, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?)\",\n119| (\n120| report_id,\n121| w.get(\"ssid\"),\n122| w.get(\"bssid\"),\n123| w.get(\"frequency\"),\n124| w.get(\"signalLevel\"),\n125| w.get(\"ipAddr\"),\n126| datetime.now(timezone.utc).isoformat(),\n127| ),\n128| )\n129|\n130| db.commit()\n131| db.close()\n132|\n133| return jsonify({\"status\": \"ok\", \"id\": report_id})\n134|\n135|\n136|@app.route(\"/api/devices\")\n137|def list_devices():\n138| \"\"\"Return all device reports, latest first.\"\"\"\n139| db = get_db()\n140| rows = db.execute(\n141| \"SELECT * FROM device_reports ORDER BY id DESC LIMIT 200\"\n142| ).fetchall()\n143|\n144| devices = []\n145| for r in rows:\n146| d = dict(r)\n147| try:\n148| d[\"connection_info_raw\"] = json.loads(d.get(\"connection_info_raw\") or \"{}\")\n149| except Exception:\n150| d[\"connection_info_raw\"] = {}\n151| try:\n152| d[\"extra_json\"] = json.loads(d.get(\"extra_json\") or \"{}\")\n153| except Exception:\n154| d[\"extra_json\"] = {}\n155|\n156| # WiFi for this report\n157| wifi_rows = db.execute(\n158| \"SELECT * FROM wifi_reports WHERE report_id = ?\", (d[\"id\"],)\n159| ).fetchall()\n160| d[\"wifi\"] = [dict(w) for w in wifi_rows]\n161|\n162| devices.append(d)\n163|\n164| db.close()\n165| return jsonify(devices)\n166|\n167|\n168|@app.route(\"/api/device/\")\n169|def device_detail(report_id):\n170| \"\"\"Return a single device report.\"\"\"\n171| db = get_db()\n172| row = db.execute(\"SELECT * FROM device_reports WHERE id = ?\", (report_id,)).fetchone()\n173| if not row:\n174| db.close()\n175| return jsonify({\"error\": \"not found\"}), 404\n176|\n177| d = dict(row)\n178| try:\n179| d[\"connection_info_raw\"] = json.loads(d.get(\"connection_info_raw\") or \"{}\")\n180| except Exception:\n181| d[\"connection_info_raw\"] = {}\n182|\n183| wifi_rows = db.execute(\n184| \"SELECT * FROM wifi_reports WHERE report_id = ?\", (report_id,)\n185| ).fetchall()\n186| d[\"wifi\"] = [dict(w) for w in wifi_rows]\n187|\n188| db.close()\n189| return jsonify(d)\n190|\n191|\n192|@app.route(\"/api/latest\")\n193|def latest():\n194| \"\"\"Return the most recent report per device_id.\"\"\"\n195| db = get_db()\n196| rows = db.execute(\"\"\"\n197| SELECT dr.* FROM device_reports dr\n198| INNER JOIN (\n199| SELECT device_id, MAX(id) as max_id\n200| FROM device_reports\n201| WHERE device_id != ''\n202| GROUP BY device_id\n203| ) latest ON dr.device_id = latest.device_id AND dr.id = latest.max_id\n204| ORDER BY dr.reported_at DESC\n205| \"\"\").fetchall()\n206|\n207| devices = []\n208| for r in rows:\n209| d = dict(r)\n210| try:\n211| d[\"connection_info_raw\"] = json.loads(d.get(\"connection_info_raw\") or \"{}\")\n212| except Exception:\n213| d[\"connection_info_raw\"] = {}\n214| wifi_rows = db.execute(\n215| \"SELECT * FROM wifi_reports WHERE report_id = ?\", (d[\"id\"],)\n216| ).fetchall()\n217| d[\"wifi\"] = [dict(w) for w in wifi_rows]\n218| devices.append(d)\n219|\n220| db.close()\n221| return jsonify(devices)\n222|\n223|\n224|@app.route(\"/dashboard\")\n225|def dashboard():\n226| \"\"\"Dashboard view of all collected data.\"\"\"\n227| return render_template(\"dashboard.html\")\n228|\n229|\n230|if __name__ == \"__main__\":\n231| app.run(host=\"127.0.0.1\", port=9118, debug=False)\n232|", "total_lines": 231, "file_size": 6853, "truncated": false, "is_binary": false, "is_image": false}
Assistant
{"output": "[\n {\n \"cell_downlink\": 1.6,\n \"cell_downlink_max\": null,\n \"cell_effective_type\": \"4g\",\n \"cell_rtt\": 0,\n \"cell_save_data\": 0,\n \"cell_type\": \"wifi\",\n \"connection_info_raw\": {\n \"downlink\": 1.6,\n \"downlinkMax\": null,\n \"effectiveType\": \"4g\",\n \"online\": true,\n \"rtt\": 0,\n \"saveData\": false,\n \"type\": \"wifi\"\n },\n \"device_id\": \"dev_v4izcc45c_mqhl0o1q\",\n \"device_name\": \"\",\n \"extra_json\": \"{\\\"battery\\\": {\\\"level\\\": 0.49, \\\"charging\\\": false}, \\\"localIp\\\": \\\"192.0.0.2\\\", \\\"userAgent\\\": \\\"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Mobile Safari/537.36\\\", \\\"screen\\\": \\\"384x854\\\", \\\"pixelRatio\\\": 2.8125, \\\"language\\\": \\\"en-US\\\", \\\"timezone\\\": \\\"America/Chicago\\\", \\\"platform\\\": \\\"Linux armv81\\\", \\\"cores\\\": 8, \\\"memory\\\": 8, \\\"touchPoints\\\": 5, \\\"onLine\\\": true, \\\"referrer\\\": \\\"\\\", \\\"url\\\": \\\"
https://location.teksploits.com/\\\"}\",\n \"gps_accuracy\": 10.85099983215332,\n \"gps_alt_accuracy\": null,\n \"gps_altitude\": 152.10000610351562,\n \"gps_heading\": 90.0,\n \"gps_lat\": 41.5972246,\n \"gps_lon\": -87.352988,\n \"gps_speed\": 0.1587430238723755,\n \"gps_timestamp\": \"2026-06-26T14:09:36.304Z\",\n \"id\": 1150,\n \"ip_addr\": \"127.0.0.1\",\n \"reported_at\": \"2026-06-26T14:09:50.628442+00:00\",\n \"user_agent\": \"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Mobile Safari/537.36\",\n \"wifi\": []\n },\n {\n \"cell_downlink\": 7.3,\n \"cell_downlink_max\": null,\n \"cell_effective_type\": \"4g\",\n \"cell_rtt\": 50,\n \"cell_save_data\": 0,\n \"cell_type\": \"unknown\",\n \"connection_info_raw\": {\n \"downlink\": 7.3,\n \"effectiveType\": \"4g\",\n \"online\": true,\n \"rtt\": 50,\n \"saveData\": false,\n \"type\": \"unknown\"\n },\n \"device_id\": \"dev_v2dpkc5sw_mqjw9v7v\",\n \"device_name\": \"\",\n \"extra_json\": \"{\\\"battery\\\": {\\\"level\\\": 0.73, \\\"charging\\\": false}, \\\"userAgent\\\": \\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36\\\", \\\"screen\\\": \\\"1280x720\\\", \\\"pixelRatio\\\": 1.5, \\\"language\\\": \\\"en-US\\\", \\\"timezone\\\": \\\"America/Chicago\\\", \\\"platform\\\": \\\"Win32\\\", \\\"cores\\\": 4, \\\"memory\\\": 16, \\\"touchPoints\\\": 0, \\\"onLine\\\": true, \\\"referrer\\\": \\\"\\\", \\\"url\\\": \\\"
https://location.teksploits.com/\\\"}\",\n \"gps_accuracy\": 94.0,\n \"gps_alt_accuracy\": null,\n \"gps_altitude\": null,\n \"gps_heading\": null,\n \"gps_lat\": 41.59685716654843,\n \"gps_lon\": -87.35307334823833,\n \"gps_speed\": null,\n \"gps_timestamp\": \"2026-06-21T15:20:52.057Z\",\n \"id\": 1136,\n \"ip_addr\": \"127.0.0.1\",\n \"reported_at\": \"2026-06-21T16:14:09.230883+00:00\",\n \"user_agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36\",\n \"wifi\": []\n },\n {\n \"cell_downlink\": 25.5,\n \"cell_downlink_max\": 100.0,\n \"cell_effective_type\": \"4g\",\n \"cell_rtt\": 45,\n \"cell_save_data\": 0,\n \"cell_type\": \"wifi\",\n \"connection_info_raw\": {\n \"downlink\": 25.5,\n \"downlinkMax\": 100,\n \"effectiveType\": \"4g\",\n \"rtt\": 45,\n \"saveData\": false,\n \"type\": \"wifi\"\n },\n \"device_id\": \"test123\",\n \"device_name\": \"Test Device\",\n \"extra_json\": \"{\\\"platform\\\": \\\"test\\\", \\\"battery\\\": {\\\"level\\\": 0.85, \\\"charging\\\": true}}\",\n \"gps_accuracy\": 10.5,\n \"gps_alt_accuracy\": null,\n \"gps_altitude\": 52.0,\n \"gps_heading\": 90.0,\n \"gps_lat\": 40.7128,\n \"gps_lon\": -74.006,\n \"gps_speed\": 0.0,\n \"gps_timestamp\": \"2026-06-16T21:15:00Z\",\n \"id\": 1,\n \"ip_addr\": \"127.0.0.1\",\n \"reported_at\": \"2026-06-17T02:15:52.860463+00:00\",\n \"user_agent\": \"curl/7.81.0\",\n \"wifi\": []\n }\n]", "exit_code": 0, "error": null, "approval": "Command required approval (Security scan — [MEDIUM] Schemeless URL in sink context: URL without explicit scheme passed to a command that downloads/executes content; [HIGH] Pipe to interpreter: curl | python3: Command pipes output from 'curl' directly to interpreter 'python3'. Downloaded content will be executed without inspection.\n Safer: tirith run
https://location.teksploits.com/api/latest — or: vet
https://location.teksploits.com/api/latest (
https://getvet.sh)) and was approved by the user."}