{"ok":true,"site":{"host":"alekseialeinikov.com","url":"https://www.alekseialeinikov.com/en/tools/","type":"live","desc":"Free, privacy-first tools for Google Cloud, Kubernetes and DevSecOps — IAM checks, cost estimates and more. Everything runs in your browser.","tools":[{"name":"search_blog_articles","kind":"answer","impl":"imperative","description":"Search Aleksei Aleinikov's engineering blog (100+ articles in English and German on Google Cloud, Kubernetes, cloud security, platform engineering, databases, architecture and AI). Returns the best-matching articles with title, topic, date, a one-line summary and URL.","title":"Search blog articles","annotations":{"readOnlyHint":true,"untrustedContentHint":false,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"What to look for, in the user's words, e.g. \"gke autopilot vs standard cost\"."},"language":{"type":"string","enum":["en","de"],"description":"Article language. Defaults to the language of the current page."},"limit":{"type":"integer","minimum":1,"maximum":8,"description":"How many results to return, 1 to 8. Default 5."}},"required":["query"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/tools/","pages":["/en/tools/","/en","/de","/en/offer","/de/offer","/en/highlights"]},{"name":"read_blog_article","kind":"answer","impl":"imperative","description":"Read an article from this blog. Without \"section\" it returns the title, summary and numbered list of sections; with \"section\" it returns that section's text. Use the URLs returned by search_blog_articles.","title":"Read a blog article","annotations":{"readOnlyHint":true,"untrustedContentHint":false,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"url":{"type":"string","description":"Article URL on alekseialeinikov.com, as returned by search_blog_articles."},"section":{"type":"string","description":"Section number or heading from the section list, e.g. \"3\" or \"Ordering\"."}},"required":["url"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/tools/","pages":["/en/tools/","/en","/de","/en/offer","/de/offer","/en/highlights"]},{"name":"check_gcp_iam_policy","kind":"answer","impl":"imperative","description":"Audit a Google Cloud IAM policy for least-privilege problems: public access (allUsers), basic Owner/Editor/Viewer roles, privilege-escalation roles, humans holding admin roles and unconditional sensitive grants. Returns findings ranked by severity, each with a fix. Runs locally in the browser; the policy is never uploaded.","annotations":{"readOnlyHint":true,"consequentialHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"policy":{"type":"string","description":"IAM policy JSON, as printed by `gcloud projects get-iam-policy PROJECT_ID --format=json`."}},"required":["policy"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/tools/","pages":["/en/tools/"]},{"name":"recommend_gcp_compute","kind":"act","impl":"imperative","description":"Recommend the best Google Cloud compute service for a workload — Cloud Run, Cloud Functions, Cloud Run jobs, GKE Autopilot, GKE Standard or Compute Engine — with why it fits, when not to use it and the strongest alternatives. Every field is optional; more answers give a sharper result.","annotations":{"readOnlyHint":true,"consequentialHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"workload":{"type":"string","enum":["service","event","batch","stateful","legacy"],"description":"What are you running? service = A web app / API; event = Event-driven glue; batch = A batch / scheduled job; stateful = A stateful system; legacy = A legacy / VM-based app"},"idle":{"type":"string","enum":["zero","warm"],"description":"When there’s no traffic? zero = Scale to zero; warm = Stay warm"},"k8s":{"type":"string","enum":["none","want","have"],"description":"Do you need Kubernetes? none = No; want = Yes; have = Already on it"},"hardware":{"type":"string","enum":["none","gpu","tpu"],"description":"Special hardware? none = None; gpu = GPU; tpu = TPU"},"ops":{"type":"string","enum":["minimal","control"],"description":"How much ops do you want to own? minimal = As little as possible; control = I want control"},"control":{"type":"string","enum":["container","custom-os"],"description":"Runtime needs? container = A standard container; custom-os = Full OS control"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/tools/","pages":["/en/tools/"]},{"name":"recommend_gcp_database","kind":"act","impl":"imperative","description":"Recommend the best Google Cloud database for a workload — Cloud SQL, AlloyDB, Spanner, Firestore, Bigtable, BigQuery or Memorystore — with why it fits, when not to use it and the strongest alternatives. Every field is optional; more answers give a sharper result.","annotations":{"readOnlyHint":true,"consequentialHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"model":{"type":"string","enum":["relational","document","keyvalue","wide","analytical"],"description":"What shape is your data? relational = Relational; document = Documents; keyvalue = Key–value; wide = Wide-column; analytical = Analytical"},"access":{"type":"string","enum":["oltp","olap","realtime","cache"],"description":"How is it accessed? oltp = Transactions (OLTP); olap = Analytics (OLAP); realtime = Real-time sync; cache = Cache / sessions"},"scale":{"type":"string","enum":["small","throughput","petabyte","global"],"description":"What scale do you need? small = Modest; throughput = Huge throughput; petabyte = Petabytes; global = Global"},"consistency":{"type":"string","enum":["strong","eventual"],"description":"Consistency needs? strong = Strong; eventual = Eventual is fine"},"existing":{"type":"string","enum":["postgres","mysql","sqlserver","greenfield"],"description":"Existing engine? postgres = PostgreSQL; mysql = MySQL; sqlserver = SQL Server; greenfield = Greenfield"},"ops":{"type":"string","enum":["serverless","managed","global"],"description":"Operational model? serverless = Serverless; managed = Managed instance; global = Globally distributed"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/tools/","pages":["/en/tools/"]},{"name":"explain_cron","kind":"act","impl":"imperative","description":"Explain a cron expression in plain language and list its next runs in a time zone, plus traps: Unix day-of-month OR day-of-week, Quartz/AWS weekday numbering, uneven steps, runs hit by daylight-saving gaps or repeats. Auto-detects Linux, Kubernetes, GitHub Actions, Cloud Scheduler, AWS EventBridge, Quartz, Spring, Azure and Vercel syntax. Runs locally.","annotations":{"readOnlyHint":true,"consequentialHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"expression":{"type":"string","description":"Cron expression, e.g. \"30 2 * * 1-5\", \"0 0 12 ? * MON#1\" or \"cron(0 9 ? * MON-FRI *)\"."},"timezone":{"type":"string","description":"IANA time zone the schedule should follow, e.g. Europe/Berlin. Default UTC."},"platform":{"type":"string","enum":["unix","kubernetes","github","gcp","aws","quartz","spring","azure","vercel"],"description":"Source; omit to auto-detect. unix=Linux, kubernetes, github=Actions, gcp=Cloud Scheduler, aws=EventBridge, quartz, spring, azure=Functions, vercel"}},"required":["expression"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/tools/","pages":["/en/tools/"]},{"name":"convert_cron","kind":"act","impl":"imperative","description":"Translate a cron schedule to another platform's exact syntax (Linux, Kubernetes, GitHub Actions, Cloud Scheduler, AWS EventBridge, Quartz, Spring, Azure Functions, Vercel) with a ready config snippet and platform caveats. Fixes weekday numbering, adds \"?\" where required, shifts to UTC for UTC-only platforms, and says when two schedules are needed. Omit \"to\" to get every platform.","annotations":{"readOnlyHint":true,"consequentialHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"expression":{"type":"string","description":"Cron expression, e.g. \"30 2 * * 1-5\", \"0 0 12 ? * MON#1\" or \"cron(0 9 ? * MON-FRI *)\"."},"timezone":{"type":"string","description":"IANA time zone the schedule should follow, e.g. Europe/Berlin. Default UTC."},"from":{"type":"string","enum":["unix","kubernetes","github","gcp","aws","quartz","spring","azure","vercel"],"description":"Source; omit to auto-detect. unix=Linux, kubernetes, github=Actions, gcp=Cloud Scheduler, aws=EventBridge, quartz, spring, azure=Functions, vercel"},"to":{"type":"string","enum":["unix","kubernetes","github","gcp","aws","quartz","spring","azure","vercel"],"description":"Target; omit for all. unix=Linux, kubernetes, github=Actions, gcp=Cloud Scheduler, aws=EventBridge, quartz, spring, azure=Functions, vercel"}},"required":["expression"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/tools/","pages":["/en/tools/"]},{"name":"analyze_jwt","kind":"act","impl":"imperative","description":"Decode a JSON Web Token and audit it like an attacker would: alg none, well-known HMAC secrets, algorithm confusion, injected jwk/jku/kid headers, missing exp/iss/aud, long lifetimes, secrets or PII in claims. Optionally verifies the signature with a key. Returns a grade A-F, decoded claims and findings with fixes. Runs locally with Web Crypto; nothing is uploaded or echoed into links.","annotations":{"readOnlyHint":true,"consequentialHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"token":{"type":"string","description":"The JWT (JWS or JWE). A \"Bearer \" or \"Authorization:\" prefix is fine."},"key":{"type":"string","description":"Optional: HMAC secret, PEM public key, X.509 certificate or JWK/JWKS JSON to verify the signature. Never pass a private key."}},"required":["token"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/tools/","pages":["/en/tools/"]}],"category":"Developer Tools","favicon":"/favicons/alekseialeinikov.com.png","apiSurface":"spec","toolCount":8}}