Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Collect Lokalise debug evidence for support tickets and troubleshooting. Use when encountering persistent issues, preparing support tickets, or collecting diagnostic information for Lokalise problems. Trigger with phrases like "lokalise debug", "lokalise support bundle", "collect lokalise logs", "lokalise diagnostic".
.claude/skills/jeremylongshore-lokalise-debug-bundle/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 131% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 84% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 104% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 184% | 0% |
!node --version 2>/dev/null || echo 'N/A' !python3 --version 2>/dev/null || echo 'N/A' !uname -a
Collect all diagnostic information needed to troubleshoot Lokalise integration issues or file a support ticket — environment versions, SDK/CLI status, API connectivity, project listings with key counts, upload process status, and redacted logs, bundled into a timestamped .tar.gz archive.
LOKALISE_API_TOKEN environment variable set (or token available to provide)curl and jq available on PATH@lokalise/node-api SDK installed in current projectlokalise2 CLI installedbashset -euo pipefail TIMESTAMP=$(date +%Y%m%d-%H%M%S) BUNDLE_DIR="lokalise-debug-${TIMESTAMP}" mkdir -p "${BUNDLE_DIR}" echo "Bundle directory: ${BUNDLE_DIR}"
bashset -euo pipefail cat > "${BUNDLE_DIR}/environment.txt" <<ENVEOF === System === OS: $(uname -srm) Shell: ${SHELL:-unknown} Date: $(date -u +"%Y-%m-%dT%H:%M:%SZ") === Runtime Versions === Node.js: $(node --version 2>/dev/null || echo 'not installed') npm: $(npm --version 2>/dev/null || echo 'not installed') Python: $(python3 --version 2>/dev/null || echo 'not installed') === Lokalise SDK === $(npm list @lokalise/node-api 2>/dev/null || echo 'SDK not found in project') === Lokalise CLI === $(lokalise2 --version 2>/dev/null || echo 'CLI not installed') === Token Status === LOKALISE_API_TOKEN: $([ -n "${LOKALISE_API_TOKEN:-}" ] && echo "SET (${#LOKALISE_API_TOKEN} chars)" || echo "NOT SET") ENVEOF echo "Environment info collected."
bashset -euo pipefail echo "=== API Connectivity Test ===" > "${BUNDLE_DIR}/api-connectivity.txt" # Test DNS resolution echo -e "\n--- DNS Resolution ---" >> "${BUNDLE_DIR}/api-connectivity.txt" nslookup api.lokalise.com 2>&1 | tail -4 >> "${BUNDLE_DIR}/api-connectivity.txt" || echo "nslookup failed" >> "${BUNDLE_DIR}/api-connectivity.txt" # Test HTTPS connectivity and response time echo -e "\n--- HTTPS Connectivity ---" >> "${BUNDLE_DIR}/api-connectivity.txt" curl -s -o /dev/null -w "HTTP Status: %{http_code}\nConnect Time: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal Time: %{time_total}s\nRemote IP: %{remote_ip}\n" \ -H "X-Api-Token: ${LOKALISE_API_TOKEN}" \ "https://api.lokalise.com/api2/system/languages?limit=1" \ >> "${BUNDLE_DIR}/api-connectivity.txt" 2>&1 # Check rate limit headers echo -e "\n--- Rate Limit Headers ---" >> "${BUNDLE_DIR}/api-connectivity.txt" curl -s -D - -o /dev/null \ -H "X-Api-Token: ${LOKALISE_API_TOKEN}" \ "https://api.lokalise.com/api2/system/languages?limit=1" 2>/dev/null \ | grep -iE '(x-ratelimit|retry-after)' >> "${BUNDLE_DIR}/api-connectivity.txt" || echo "No rate limit headers found" >> "${BUNDLE_DIR}/api-connectivity.txt" echo "API connectivity tested."
bashset -euo pipefail echo "Fetching project list..." curl -s -H "X-Api-Token: ${LOKALISE_API_TOKEN}" \ "https://api.lokalise.com/api2/projects?limit=100&include_statistics=1" \ | jq '[.projects[] | { project_id: .project_id, name: .name, base_language: .base_language_iso, keys: .statistics.keys_total, languages: (.statistics.languages // [] | length), progress: .statistics.progress_total, created: .created_at }]' > "${BUNDLE_DIR}/projects.json" 2>/dev/null || echo '{"error": "Failed to fetch projects"}' > "${BUNDLE_DIR}/projects.json" # Summary line PROJ_COUNT=$(jq 'length' "${BUNDLE_DIR}/projects.json" 2>/dev/null || echo "0") TOTAL_KEYS=$(jq '[.[].keys // 0] | add // 0' "${BUNDLE_DIR}/projects.json" 2>/dev/null || echo "0") echo "Found ${PROJ_COUNT} projects with ${TOTAL_KEYS} total keys."
bashset -euo pipefail # Check queued processes for each project (file uploads are async) echo "[]" > "${BUNDLE_DIR}/processes.json" for PID in $(jq -r '.[].project_id' "${BUNDLE_DIR}/projects.json" 2>/dev/null); do curl -s -H "X-Api-Token: ${LOKALISE_API_TOKEN}" \ "https://api.lokalise.com/api2/projects/${PID}/processes?limit=10" \ | jq --arg pid "$PID" '[.processes[]? | {project_id: $pid, type: .type, status: .status, created_at: .created_at, message: .message}]' \ >> "${BUNDLE_DIR}/processes-raw.json" 2>/dev/null || true sleep 0.17 # Respect 6 req/s rate limit done # Merge all process entries jq -s 'flatten' "${BUNDLE_DIR}/processes-raw.json" > "${BUNDLE_DIR}/processes.json" 2>/dev/null || true rm -f "${BUNDLE_DIR}/processes-raw.json" PROC_COUNT=$(jq 'length' "${BUNDLE_DIR}/processes.json" 2>/dev/null || echo "0") echo "Found ${PROC_COUNT} recent upload processes."
bashset -euo pipefail # Gather any lokalise-related log lines from common locations { echo "=== npm debug log (if exists) ===" cat ~/.npm/_logs/*-debug.log 2>/dev/null | grep -i lokalise | tail -50 || echo "No npm debug logs" echo -e "\n=== Application stderr/stdout (recent) ===" grep -ri "lokalise" /tmp/*.log 2>/dev/null | tail -30 || echo "No /tmp logs found" } > "${BUNDLE_DIR}/logs-raw.txt" 2>/dev/null || true # Redact sensitive values sed -E \ -e 's/([0-9a-f]{32,})/[REDACTED_TOKEN]/gi' \ -e 's/(X-Api-Token:\s*)[^ ]*/\1[REDACTED]/gi' \ -e 's/(apiKey:\s*["'"'"']?)[^"'"'"',]+/\1[REDACTED]/gi' \ -e 's/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/[REDACTED_EMAIL]/g' \ "${BUNDLE_DIR}/logs-raw.txt" > "${BUNDLE_DIR}/logs-redacted.txt" 2>/dev/null || true rm -f "${BUNDLE_DIR}/logs-raw.txt" echo "Logs collected and redacted."
bashset -euo pipefail tar -czf "${BUNDLE_DIR}.tar.gz" "${BUNDLE_DIR}/" SIZE=$(du -h "${BUNDLE_DIR}.tar.gz" | cut -f1) echo "Bundle created: ${BUNDLE_DIR}.tar.gz (${SIZE})" echo "Contents:" tar -tzf "${BUNDLE_DIR}.tar.gz"
lokalise-debug-YYYYMMDD-HHMMSS.tar.gz archive containing:environment.txt — Node.js, SDK, CLI versions, token statusapi-connectivity.txt — DNS, HTTPS latency, rate limit headersprojects.json — Project list with key/language counts and progressprocesses.json — Recent file upload process statuses per projectlogs-redacted.txt — Relevant logs with tokens and emails scrubbed| Issue | Cause | Solution | |-------|-------|----------| | 401 Unauthorized | Token invalid or expired | Regenerate token in Lokalise > User Profile > API Tokens | | 403 Forbidden | Token lacks read scope | Use a read-write token or admin token | | 429 Too Many Requests | Rate limit exceeded during project scan | Script includes sleep 0.17 between calls; reduce --limit if still hitting | | Empty projects.json | Token has no project access | Verify the token owner is a contributor on at least one project | | nslookup fails | DNS resolution blocked | Try dig api.lokalise.com or check /etc/resolv.conf | | tar permission denied | Bundle dir in read-only location | Run from a writable directory like ~/tmp |
bashset -euo pipefail curl -s -w "\nHTTP %{http_code} in %{time_total}s\n" \ -H "X-Api-Token: $LOKALISE_API_TOKEN" \ "https://api.lokalise.com/api2/projects?limit=1" | jq '{project: .projects[0].name, keys: .projects[0].statistics.keys_total}'
bashset -euo pipefail node -e "const pkg = require('@lokalise/node-api/package.json'); console.log('SDK:', pkg.version, '| Node:', process.version)"
Always redacted: API tokens, webhook secrets, OAuth credentials, email addresses, any 32+ character hex strings.
Safe to include: Error messages, stack traces (after redaction pass), SDK and runtime versions, project IDs, HTTP status codes, rate limit header values.
lokalise-performance-tuning.lokalise-upgrade-migration..tar.gz bundle directly to a Lokalise support ticket at support@lokalise.com.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 29,410 | 23,652 | -20% | 1 | 1 | 0% | 4,567 | 5,695 | +25% | 0 | 0 | — |
case-02 | fail→fail | 31,632 | 19,337 | -39% | 1 | 1 | 0% | 5,303 | 3,171 | -40% | 0 | 0 | — |
case-03 | fail→fail | 24,049 | 18,533 | -23% | 1 | 1 | 0% | 3,540 | 3,143 | -11% | 0 | 0 | — |
case-04 | fail→pass | 14,681 | 11,709 | -20% | 1 | 1 | 0% | 1,723 | 3,973 | +131% | 0 | 0 | — |
case-05 | fail→pass | 17,573 | 13,778 | -22% | 1 | 1 | 0% | 2,352 | 4,337 | +84% | 0 | 0 | — |
case-06 | fail→pass | 16,232 | 10,084 | -38% | 1 | 1 | 0% | 1,834 | 3,735 | +104% | 0 | 0 | — |
case-07 | pass→pass | 7,509 | 10,564 | +41% | 1 | 1 | 0% | 1,222 | 3,709 | +204% | 0 | 0 | — |
case-08 | pass→pass | 23,359 | 22,185 | -5% | 1 | 1 | 0% | 3,243 | 6,053 | +87% | 0 | 0 | — |
case-09 | fail→pass | 10,695 | 3,873 | -64% | 1 | 1 | 0% | 1,137 | 3,227 | +184% | 0 | 0 | — |
case-10 | pass→pass | 13,367 | 5,752 | -57% | 1 | 1 | 0% | 1,203 | 3,521 | +193% | 0 | 0 | — |
case-11 | fail→pass | 29,504 | 14,338 | -51% | 1 | 1 | 0% | 4,587 | 5,435 | +18% | 0 | 0 | — |
case-12 | pass→pass | 18,548 | 9,703 | -48% | 1 | 1 | 0% | 2,226 | 3,676 | +65% | 0 | 0 | — |
case-13 | pass→pass | 12,494 | 12,953 | +4% | 1 | 1 | 0% | 1,880 | 3,899 | +107% | 0 | 0 | — |
case-14 | pass→pass | 14,091 | 7,704 | -45% | 1 | 1 | 0% | 1,668 | 3,162 | +90% | 0 | 0 | — |
case-15 | fail→pass | 16,025 | 9,888 | -38% | 1 | 1 | 0% | 1,839 | 3,658 | +99% | 0 | 0 | — |
case-16 | fail→pass | 10,543 | 4,017 | -62% | 1 | 1 | 0% | 748 | 3,488 | +366% | 0 | 0 | — |
case-17 | pass→pass | 14,777 | 10,535 | -29% | 1 | 1 | 0% | 1,672 | 4,301 | +157% | 0 | 0 | — |
case-18 | pass→pass | 10,816 | 13,636 | +26% | 1 | 1 | 0% | 1,718 | 4,095 | +138% | 0 | 0 | — |
case-19 | pass→pass | 15,165 | 22,146 | +46% | 1 | 1 | 0% | 1,949 | 5,539 | +184% | 0 | 0 | — |
case-20 | pass→pass | 31,325 | 19,709 | -37% | 1 | 1 | 0% | 4,543 | 6,427 | +41% | 0 | 0 | — |
case-21 | pass→pass | 19,409 | 16,920 | -13% | 1 | 1 | 0% | 2,825 | 6,158 | +118% | 0 | 0 | — |
case-22 | pass→pass | 32,597 | 16,778 | -49% | 1 | 1 | 0% | 3,529 | 6,439 | +82% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +36 percentage points is the difference between those two pass rates over the 20 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.