[{"canonical_url":"https://ilham.dev/tools/base64-string-converter/","category":"encoding","category_name":"Encoding","description":"Encode and decode UTF-8 text to and from Base64, URL-safe optional.","examples":["What is URL-safe Base64 for?","Is Base64 a form of encryption?"],"features":["Runs in the browser","No login required"],"id":"base64-string-converter","keywords":["base64","encode","decode","text","string"],"markdown_url":"https://ilham.dev/tools/base64-string-converter/index.md","name":"Base64 Text","url":"https://ilham.dev/tools/base64-string-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/base64-file-converter/","category":"encoding","category_name":"Encoding","description":"Turn any file into a Base64 data string, or decode one back to a file.","examples":["Is there a size limit?","Should I embed images as data URIs?"],"features":["Runs in the browser","No login required"],"id":"base64-file-converter","keywords":["base64","file","encode","decode","data uri"],"markdown_url":"https://ilham.dev/tools/base64-file-converter/index.md","name":"Base64 File","url":"https://ilham.dev/tools/base64-file-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/url-encoder/","category":"encoding","category_name":"Encoding","description":"Percent-encode and decode URL components.","examples":["Should I encode the whole URL or just a parameter?"],"features":["Runs in the browser","No login required"],"id":"url-encoder","keywords":["url","uri","encode","decode","percent","escape"],"markdown_url":"https://ilham.dev/tools/url-encoder/index.md","name":"URL Encoder","url":"https://ilham.dev/tools/url-encoder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/html-entities/","category":"encoding","category_name":"Encoding","description":"Escape and unescape HTML special characters.","examples":["Which characters actually need escaping?"],"features":["Runs in the browser","No login required"],"id":"html-entities","keywords":["html","entities","escape","unescape","xss"],"markdown_url":"https://ilham.dev/tools/html-entities/index.md","name":"HTML Entities","url":"https://ilham.dev/tools/html-entities/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/text-to-binary/","category":"encoding","category_name":"Encoding","description":"Convert text to its binary representation and back.","examples":["Why is one character sometimes more than eight bits?"],"features":["Runs in the browser","No login required"],"id":"text-to-binary","keywords":["binary","bits","text","encode","decode"],"markdown_url":"https://ilham.dev/tools/text-to-binary/index.md","name":"Text to Binary","url":"https://ilham.dev/tools/text-to-binary/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/text-to-unicode/","category":"encoding","category_name":"Encoding","description":"Show the Unicode code points of a string, and rebuild a string from them.","examples":["What is the difference between a code point and a UTF-8 byte?","Why does text I copied have an invisible character in it?"],"features":["Runs in the browser","No login required"],"id":"text-to-unicode","keywords":["unicode","codepoint","utf8","escape"],"markdown_url":"https://ilham.dev/tools/text-to-unicode/index.md","name":"Text to Unicode","url":"https://ilham.dev/tools/text-to-unicode/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/text-to-nato-alphabet/","category":"encoding","category_name":"Encoding","description":"Spell out text using the NATO phonetic alphabet.","examples":["Why Alfa and Juliett, with a double t?"],"features":["Runs in the browser","No login required"],"id":"text-to-nato-alphabet","keywords":["nato","phonetic","alphabet","spell"],"markdown_url":"https://ilham.dev/tools/text-to-nato-alphabet/index.md","name":"NATO Alphabet","url":"https://ilham.dev/tools/text-to-nato-alphabet/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/string-obfuscator/","category":"encoding","category_name":"Encoding","description":"Obfuscate part of a string while keeping it readable.","examples":["Is this a security measure?"],"features":["Runs in the browser","No login required"],"id":"string-obfuscator","keywords":["obfuscate","mask","redact","string"],"markdown_url":"https://ilham.dev/tools/string-obfuscator/index.md","name":"String Obfuscator","url":"https://ilham.dev/tools/string-obfuscator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/safelink-decoder/","category":"encoding","category_name":"Encoding","description":"Extract the real destination behind an Outlook SafeLink.","examples":["Why do SafeLinks exist?"],"features":["Runs in the browser","No login required"],"id":"safelink-decoder","keywords":["safelink","outlook","decode","url"],"markdown_url":"https://ilham.dev/tools/safelink-decoder/index.md","name":"SafeLink Decoder","url":"https://ilham.dev/tools/safelink-decoder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/basic-auth-generator/","category":"encoding","category_name":"Encoding","description":"Build an HTTP Basic Authorization header from a user and password.","examples":["Is Basic authentication encrypted?"],"features":["Runs in the browser","No login required"],"id":"basic-auth-generator","keywords":["basic auth","http","header","authorization","base64"],"markdown_url":"https://ilham.dev/tools/basic-auth-generator/index.md","name":"Basic Auth Header","url":"https://ilham.dev/tools/basic-auth-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/json-formatter/","category":"formats","category_name":"Formats","description":"Validate, pretty-print and minify JSON, with optional key sorting.","examples":["Does sorting also reorder arrays?","What is the difference between this and the JSON Viewer?","Is my data uploaded anywhere?"],"features":["Format JSON","Validate JSON syntax","Minify JSON","Sort object keys","Show parse errors"],"id":"json-formatter","keywords":["json","json formatter","json beautifier","pretty print json","json pretty printer","json validator","json checker","json minifier","sort json object keys","api response formatter"],"markdown_url":"https://ilham.dev/tools/json-formatter/index.md","name":"JSON Formatter","url":"https://ilham.dev/tools/json-formatter/","use_cases":["Debug API responses","Format JSON configuration files","Validate JSON syntax before pasting into an application","Minify JSON for compact storage or transport"]},{"canonical_url":"https://ilham.dev/tools/json-viewer/","category":"formats","category_name":"Formats","description":"Explore a JSON document as a collapsible tree or as a table of records, with a live count of nested values.","examples":["What decides the columns in the table view?","How are nested objects and arrays shown in a cell?","Can it open a large file?","Can I get a single value out?"],"features":["Runs in the browser","No login required"],"id":"json-viewer","keywords":["json","viewer","tree","table","grid","records","explore","inspect","collapse","structure","postman"],"markdown_url":"https://ilham.dev/tools/json-viewer/index.md","name":"JSON Viewer","url":"https://ilham.dev/tools/json-viewer/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/json-minifier/","category":"formats","category_name":"Formats","description":"Strip all whitespace from JSON to shrink it.","examples":["How much smaller does it get?"],"features":["Runs in the browser","No login required"],"id":"json-minifier","keywords":["json","minify","compress","compact"],"markdown_url":"https://ilham.dev/tools/json-minifier/index.md","name":"JSON Minifier","url":"https://ilham.dev/tools/json-minifier/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/json-to-yaml/","category":"formats","category_name":"Formats","description":"Convert JSON documents to YAML.","examples":["Are comments kept?","Why does my document fail to convert?"],"features":["Runs in the browser","No login required"],"id":"json-to-yaml","keywords":["json","yaml","convert"],"markdown_url":"https://ilham.dev/tools/json-to-yaml/index.md","name":"JSON to YAML","url":"https://ilham.dev/tools/json-to-yaml/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/yaml-to-json/","category":"formats","category_name":"Formats","description":"Convert YAML documents to JSON.","examples":["What happens to a non-string key?","Are duplicate keys allowed?"],"features":["Runs in the browser","No login required"],"id":"yaml-to-json","keywords":["yaml","json","convert"],"markdown_url":"https://ilham.dev/tools/yaml-to-json/index.md","name":"YAML to JSON","url":"https://ilham.dev/tools/yaml-to-json/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/yaml-to-toml/","category":"formats","category_name":"Formats","description":"Convert YAML documents to TOML.","examples":["What happens to a null value?","Does key order survive?"],"features":["Runs in the browser","No login required"],"id":"yaml-to-toml","keywords":["yaml","toml","convert"],"markdown_url":"https://ilham.dev/tools/yaml-to-toml/index.md","name":"YAML to TOML","url":"https://ilham.dev/tools/yaml-to-toml/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/toml-to-yaml/","category":"formats","category_name":"Formats","description":"Convert TOML documents to YAML.","examples":["How are TOML dates represented?"],"features":["Runs in the browser","No login required"],"id":"toml-to-yaml","keywords":["toml","yaml","convert"],"markdown_url":"https://ilham.dev/tools/toml-to-yaml/index.md","name":"TOML to YAML","url":"https://ilham.dev/tools/toml-to-yaml/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/json-to-toml/","category":"formats","category_name":"Formats","description":"Convert JSON documents to TOML.","examples":["Why is a nested structure sometimes rejected?"],"features":["Runs in the browser","No login required"],"id":"json-to-toml","keywords":["json","toml","convert"],"markdown_url":"https://ilham.dev/tools/json-to-toml/index.md","name":"JSON to TOML","url":"https://ilham.dev/tools/json-to-toml/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/toml-to-json/","category":"formats","category_name":"Formats","description":"Convert TOML documents to JSON.","examples":["How are TOML dates represented?"],"features":["Runs in the browser","No login required"],"id":"toml-to-json","keywords":["toml","json","convert"],"markdown_url":"https://ilham.dev/tools/toml-to-json/index.md","name":"TOML to JSON","url":"https://ilham.dev/tools/toml-to-json/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/xml-formatter/","category":"formats","category_name":"Formats","description":"Pretty-print and minify XML.","examples":["Does it preserve CDATA and comments?","Why does it refuse my file?"],"features":["Runs in the browser","No login required"],"id":"xml-formatter","keywords":["xml","format","pretty","minify"],"markdown_url":"https://ilham.dev/tools/xml-formatter/index.md","name":"XML Formatter","url":"https://ilham.dev/tools/xml-formatter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/xml-to-json/","category":"formats","category_name":"Formats","description":"Convert XML documents to JSON.","examples":["Is the conversion reversible?"],"features":["Runs in the browser","No login required"],"id":"xml-to-json","keywords":["xml","json","convert"],"markdown_url":"https://ilham.dev/tools/xml-to-json/index.md","name":"XML to JSON","url":"https://ilham.dev/tools/xml-to-json/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/json-to-xml/","category":"formats","category_name":"Formats","description":"Convert JSON documents to XML.","examples":["What happens to an array?"],"features":["Runs in the browser","No login required"],"id":"json-to-xml","keywords":["json","xml","convert"],"markdown_url":"https://ilham.dev/tools/json-to-xml/index.md","name":"JSON to XML","url":"https://ilham.dev/tools/json-to-xml/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/json-to-csv/","category":"formats","category_name":"Formats","description":"Flatten a JSON array of objects into CSV.","examples":["What happens to nested objects?","Why are some cells empty?"],"features":["Runs in the browser","No login required"],"id":"json-to-csv","keywords":["json","csv","convert","export"],"markdown_url":"https://ilham.dev/tools/json-to-csv/index.md","name":"JSON to CSV","url":"https://ilham.dev/tools/json-to-csv/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/sql-prettify/","category":"formats","category_name":"Formats","description":"Reformat SQL queries so they are readable.","examples":["Does it understand my dialect?"],"features":["Runs in the browser","No login required"],"id":"sql-prettify","keywords":["sql","format","pretty","query"],"markdown_url":"https://ilham.dev/tools/sql-prettify/index.md","name":"SQL Prettify","url":"https://ilham.dev/tools/sql-prettify/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/markdown-to-html/","category":"formats","category_name":"Formats","description":"Render Markdown to HTML in the browser.","examples":["Is the output sanitised?","Which flavour of Markdown is this?"],"features":["Runs in the browser","No login required"],"id":"markdown-to-html","keywords":["markdown","md","html","render","convert"],"markdown_url":"https://ilham.dev/tools/markdown-to-html/index.md","name":"Markdown to HTML","url":"https://ilham.dev/tools/markdown-to-html/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/yaml-viewer/","category":"formats","category_name":"Formats","description":"Validate and explore a YAML document.","examples":["Are YAML anchors expanded?"],"features":["Runs in the browser","No login required"],"id":"yaml-viewer","keywords":["yaml","viewer","validate","tree"],"markdown_url":"https://ilham.dev/tools/yaml-viewer/index.md","name":"YAML Viewer","url":"https://ilham.dev/tools/yaml-viewer/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/list-converter/","category":"formats","category_name":"Formats","description":"Convert between line lists, CSV, JSON arrays and other list formats.","examples":["Does it deduplicate or sort?","Why is my SQL IN clause broken?"],"features":["Runs in the browser","No login required"],"id":"list-converter","keywords":["list","csv","json","lines","convert"],"markdown_url":"https://ilham.dev/tools/list-converter/index.md","name":"List Converter","url":"https://ilham.dev/tools/list-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/hash-text/","category":"crypto","category_name":"Crypto","description":"Compute MD5, SHA-1, SHA-256 and SHA-512 digests of text.","examples":["Can I use MD5 for passwords?","Why is there no SHA-3?"],"features":["Runs in the browser","No login required"],"id":"hash-text","keywords":["hash","md5","sha1","sha256","sha512","digest","checksum"],"markdown_url":"https://ilham.dev/tools/hash-text/index.md","name":"Hash Text","url":"https://ilham.dev/tools/hash-text/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/file-hash-checker/","category":"crypto","category_name":"Crypto","description":"Hash a file with MD5, SHA-1, SHA-256 and SHA-512, and check it against a published digest.","examples":["Is MD5 still worth using?","Why is SHA-512 off by default?","What happens with a very large file?","I pasted a hash and it said the lengths are not comparable. What does that mean?"],"features":["Runs in the browser","No login required"],"id":"file-hash-checker","keywords":["file","hash","checksum","md5","sha1","sha256","sha512","verify","integrity","iso","download","digest","verify download"],"markdown_url":"https://ilham.dev/tools/file-hash-checker/index.md","name":"File Hash Checker","url":"https://ilham.dev/tools/file-hash-checker/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/ssh-key-generator/","category":"crypto","category_name":"Crypto","description":"Generate an Ed25519, ECDSA or RSA key pair, with the OpenSSH public key and fingerprints.","examples":["Why is the private key in OpenSSH format instead of PKCS#8?","How do I use the key once I have downloaded it?","Which key type should I pick?","Are the fingerprints real, or does the page just make them up?"],"features":["Runs in the browser","No login required"],"id":"ssh-key-generator","keywords":["ssh","key","keygen","key pair","ed25519","rsa","ecdsa","openssh","authorized_keys","fingerprint","id_rsa","id_ed25519","pem","pkcs8"],"markdown_url":"https://ilham.dev/tools/ssh-key-generator/index.md","name":"SSH Key Generator","url":"https://ilham.dev/tools/ssh-key-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/hmac-generator/","category":"crypto","category_name":"Crypto","description":"Compute keyed HMAC signatures with a choice of digest.","examples":["What is the difference between an HMAC and a plain hash?","Should I use hex or base64?","How does the verify box decide if it matches?"],"features":["Runs in the browser","No login required"],"id":"hmac-generator","keywords":["hmac","signature","key","sha256","mac"],"markdown_url":"https://ilham.dev/tools/hmac-generator/index.md","name":"HMAC Generator","url":"https://ilham.dev/tools/hmac-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/uuid-generator/","category":"crypto","category_name":"Crypto","description":"Generate v4 UUIDs, single or in bulk.","examples":["Can two generated UUIDs collide?","Are these UUIDs predictable?"],"features":["Runs in the browser","No login required"],"id":"uuid-generator","keywords":["uuid","guid","v4","random","id","unique"],"markdown_url":"https://ilham.dev/tools/uuid-generator/index.md","name":"UUID Generator","url":"https://ilham.dev/tools/uuid-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/ulid-generator/","category":"crypto","category_name":"Crypto","description":"Generate sortable ULIDs, single or in bulk.","examples":["Should I use a ULID or a UUID?","Are ULIDs case-sensitive?"],"features":["Runs in the browser","No login required"],"id":"ulid-generator","keywords":["ulid","id","sortable","random"],"markdown_url":"https://ilham.dev/tools/ulid-generator/index.md","name":"ULID Generator","url":"https://ilham.dev/tools/ulid-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/token-generator/","category":"crypto","category_name":"Crypto","description":"Generate random tokens and passwords of a chosen length and charset.","examples":["How long should a token be?","Is Math.random good enough for this?"],"features":["Runs in the browser","No login required"],"id":"token-generator","keywords":["token","random","password","secret","string"],"markdown_url":"https://ilham.dev/tools/token-generator/index.md","name":"Token Generator","url":"https://ilham.dev/tools/token-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/bcrypt/","category":"crypto","category_name":"Crypto","description":"Hash a password with bcrypt, or verify one against a hash.","examples":["Which cost factor should I use?","Why does the same password give a different hash every time?"],"features":["Runs in the browser","No login required"],"id":"bcrypt","keywords":["bcrypt","password","hash","verify","salt","generator"],"markdown_url":"https://ilham.dev/tools/bcrypt/index.md","name":"bcrypt","url":"https://ilham.dev/tools/bcrypt/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/aes-encryption/","category":"crypto","category_name":"Crypto","description":"Encrypt and decrypt text with AES.","examples":["Is this strong enough for real data?","Why does the ciphertext change every time?","Is the passphrase sent anywhere?"],"features":["Runs in the browser","No login required"],"id":"aes-encryption","keywords":["aes","encrypt","decrypt","cipher","crypto"],"markdown_url":"https://ilham.dev/tools/aes-encryption/index.md","name":"AES Encryption","url":"https://ilham.dev/tools/aes-encryption/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/tls-certificate-decoder/","category":"crypto","category_name":"Crypto","description":"Decode X.509 PEM certificates to inspect subject, issuer, SANs, validity dates, public key details, and SHA-256 fingerprints locally.","examples":["Does this verify that my certificate is trusted?","Does my certificate leave the browser?","Can I paste a full certificate chain?","Which extensions does it decode?"],"features":["Decode core X.509 certificate fields and SANs","Inspect UTC validity dates against the device clock","Compute a SHA-256 certificate fingerprint","Decode up to 20 PEM certificates in input order"],"id":"tls-certificate-decoder","keywords":["tls","ssl","certificate","x509","pem","san","subject alternative name","issuer","expiry","fingerprint","openssl","chain"],"markdown_url":"https://ilham.dev/tools/tls-certificate-decoder/index.md","name":"TLS Certificate Decoder","url":"https://ilham.dev/tools/tls-certificate-decoder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/rsa-key-pair/","category":"crypto","category_name":"Crypto","description":"Generate an RSA public and private key pair, and check whether two keys match.","examples":["How many bits should the key be?","How do you tell whether two keys match?","Which key formats are accepted for the check?","Is a key generated in a browser trustworthy?"],"features":["Runs in the browser","No login required"],"id":"rsa-key-pair","keywords":["rsa","keypair","public","private","pem","crypto","match","verify","check","openssl"],"markdown_url":"https://ilham.dev/tools/rsa-key-pair/index.md","name":"RSA Key Pair","url":"https://ilham.dev/tools/rsa-key-pair/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/bip39/","category":"crypto","category_name":"Crypto","description":"Generate a BIP39 mnemonic phrase and derive its seed.","examples":["Is it safe to generate a wallet seed in a browser?","Why does it reject my phrase?"],"features":["Runs in the browser","No login required"],"id":"bip39","keywords":["bip39","mnemonic","seed","wallet","crypto"],"markdown_url":"https://ilham.dev/tools/bip39/index.md","name":"BIP39 Mnemonic","url":"https://ilham.dev/tools/bip39/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/password-strength/","category":"crypto","category_name":"Crypto","description":"Estimate how long a password would take to crack.","examples":["Why does my password score badly?","Is my password sent anywhere?"],"features":["Runs in the browser","No login required"],"id":"password-strength","keywords":["password","strength","entropy","crack","security"],"markdown_url":"https://ilham.dev/tools/password-strength/index.md","name":"Password Strength","url":"https://ilham.dev/tools/password-strength/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/pdf-signature-checker/","category":"crypto","category_name":"Crypto","description":"Inspect the digital signatures embedded in a PDF.","examples":["Does this prove the signer's identity?","Why is a signature reported as invalid?"],"features":["Runs in the browser","No login required"],"id":"pdf-signature-checker","keywords":["pdf","signature","certificate","verify"],"markdown_url":"https://ilham.dev/tools/pdf-signature-checker/index.md","name":"PDF Signature Checker","url":"https://ilham.dev/tools/pdf-signature-checker/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/ip-lookup/","category":"network","category_name":"Network","description":"Show your public IP (or any address) with its country, city, coordinates and ISP.","examples":["Why does it show a different city than where I am?","Which services does it use?","Does this site store my address?"],"features":["Runs in the browser","No login required"],"id":"ip-lookup","keywords":["ip","geolocation","geo","my ip","public ip","location","isp","asn","country","city","map"],"markdown_url":"https://ilham.dev/tools/ip-lookup/index.md","name":"IP \u0026 Geolocation Lookup","url":"https://ilham.dev/tools/ip-lookup/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/http-request-tester/","category":"network","category_name":"Network","description":"Send an HTTP request from the browser and inspect responses.","examples":["Why did a request fail with a CORS error instead of returning a response?","Can I paste a curl command here?","Why was the body left off my GET request?","Can I send cookies to another site?"],"features":["Runs in the browser","No login required"],"id":"http-request-tester","keywords":["http","request","api","rest","postman","fetch","headers","post","get","debug","client","endpoint","test api"],"markdown_url":"https://ilham.dev/tools/http-request-tester/index.md","name":"HTTP Request Tester","url":"https://ilham.dev/tools/http-request-tester/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/cors-checker/","category":"network","category_name":"Network","description":"Check whether a URL can be read from this browser origin and inspect visible CORS headers.","examples":["Why does it say blocked without showing the server headers?"],"features":["Runs in the browser","No login required"],"id":"cors-checker","keywords":["cors","origin","access-control","header","api","browser","preflight","options"],"markdown_url":"https://ilham.dev/tools/cors-checker/index.md","name":"CORS Checker","url":"https://ilham.dev/tools/cors-checker/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/curl-tester/","category":"network","category_name":"Network","description":"Parse, explain and rebuild curl commands locally.","examples":["Does this send the request?"],"features":["Runs in the browser","No login required"],"id":"curl-tester","keywords":["curl","http","request","command","import","export","api"],"markdown_url":"https://ilham.dev/tools/curl-tester/index.md","name":"curl Tester","url":"https://ilham.dev/tools/curl-tester/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/curl-converter/","category":"network","category_name":"Network","description":"Convert curl commands into JavaScript fetch, Axios or Python requests code.","examples":["Does it execute the request?"],"features":["Runs in the browser","No login required"],"id":"curl-converter","keywords":["curl","fetch","axios","python","requests","convert","code","http"],"markdown_url":"https://ilham.dev/tools/curl-converter/index.md","name":"curl Converter","url":"https://ilham.dev/tools/curl-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/grpc-tester/","category":"network","category_name":"Network","description":"Build grpcurl commands and test gRPC-Web endpoints from the browser.","examples":["Can a browser call native gRPC?"],"features":["Runs in the browser","No login required"],"id":"grpc-tester","keywords":["grpc","grpc-web","grpcurl","protobuf","api","tester","http2"],"markdown_url":"https://ilham.dev/tools/grpc-tester/index.md","name":"gRPC Tester","url":"https://ilham.dev/tools/grpc-tester/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/dns-lookup/","category":"network","category_name":"Network","description":"Resolve A, AAAA, MX, TXT, NS, SOA, CAA and SRV records over DNS-over-HTTPS.","examples":["Why is there no ANY query?","Is this the same as dig?","Why do I get a different answer than my own resolver?"],"features":["Runs in the browser","No login required"],"id":"dns-lookup","keywords":["dns","lookup","resolve","a","aaaa","mx","txt","ns","soa","caa","srv","nameserver","doh","dig","nslookup"],"markdown_url":"https://ilham.dev/tools/dns-lookup/index.md","name":"DNS Lookup","url":"https://ilham.dev/tools/dns-lookup/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/whois-lookup/","category":"network","category_name":"Network","description":"Show registrar, registration and expiry dates, status and nameservers for a domain.","examples":["Why do some domains return nothing?","Why is the registrant hidden?","What is the difference between RDAP and WHOIS?"],"features":["Runs in the browser","No login required"],"id":"whois-lookup","keywords":["whois","rdap","domain","registrar","expiry","expiration","registration","nameserver","owner","lookup"],"markdown_url":"https://ilham.dev/tools/whois-lookup/index.md","name":"WHOIS Lookup","url":"https://ilham.dev/tools/whois-lookup/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/ipv4-subnet-calculator/","category":"network","category_name":"Network","description":"Work out the network, broadcast, mask and host range for a CIDR block.","examples":["Why is the usable host count two less than the total?","Can it plan a VLSM layout?"],"features":["Runs in the browser","No login required"],"id":"ipv4-subnet-calculator","keywords":["ipv4","subnet","cidr","netmask","network","broadcast"],"markdown_url":"https://ilham.dev/tools/ipv4-subnet-calculator/index.md","name":"IPv4 Subnet Calculator","url":"https://ilham.dev/tools/ipv4-subnet-calculator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/ipv4-address-converter/","category":"network","category_name":"Network","description":"Convert between dotted, decimal, hex and binary IPv4 forms.","examples":["Why does 127.0.0.1 become 2130706433?","Why would I need the integer form?"],"features":["Runs in the browser","No login required"],"id":"ipv4-address-converter","keywords":["ipv4","ip","decimal","hex","binary","convert"],"markdown_url":"https://ilham.dev/tools/ipv4-address-converter/index.md","name":"IPv4 Address Converter","url":"https://ilham.dev/tools/ipv4-address-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/ipv4-range-expander/","category":"network","category_name":"Network","description":"Expand an IP range into the CIDR blocks that cover it.","examples":["Why does it return several blocks instead of one?"],"features":["Runs in the browser","No login required"],"id":"ipv4-range-expander","keywords":["ipv4","range","cidr","expand"],"markdown_url":"https://ilham.dev/tools/ipv4-range-expander/index.md","name":"IPv4 Range Expander","url":"https://ilham.dev/tools/ipv4-range-expander/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/ipv6-ula-generator/","category":"network","category_name":"Network","description":"Generate a random IPv6 unique local address prefix.","examples":["What is the difference between fc00::/7 and fd00::/8?"],"features":["Runs in the browser","No login required"],"id":"ipv6-ula-generator","keywords":["ipv6","ula","local","prefix","random"],"markdown_url":"https://ilham.dev/tools/ipv6-ula-generator/index.md","name":"IPv6 ULA Generator","url":"https://ilham.dev/tools/ipv6-ula-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/mac-address-lookup/","category":"network","category_name":"Network","description":"Look up the vendor behind a MAC address OUI.","examples":["Why does a lookup return nothing?"],"features":["Runs in the browser","No login required"],"id":"mac-address-lookup","keywords":["mac","oui","vendor","lookup","network"],"markdown_url":"https://ilham.dev/tools/mac-address-lookup/index.md","name":"MAC Address Lookup","url":"https://ilham.dev/tools/mac-address-lookup/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/mac-address-generator/","category":"network","category_name":"Network","description":"Generate random MAC addresses, with optional prefix.","examples":["Can I use a generated MAC on a real network?"],"features":["Runs in the browser","No login required"],"id":"mac-address-generator","keywords":["mac","address","random","generate","network"],"markdown_url":"https://ilham.dev/tools/mac-address-generator/index.md","name":"MAC Address Generator","url":"https://ilham.dev/tools/mac-address-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/random-port-generator/","category":"network","category_name":"Network","description":"Pick one or more unused-looking port numbers.","examples":["Does it check whether the port is free?"],"features":["Runs in the browser","No login required"],"id":"random-port-generator","keywords":["port","random","network","tcp","udp"],"markdown_url":"https://ilham.dev/tools/random-port-generator/index.md","name":"Random Port Generator","url":"https://ilham.dev/tools/random-port-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/websocket-tester/","category":"network","category_name":"Network","description":"Open a WebSocket from the page, send frames and watch what the server sends back.","examples":["Why can I not connect to a ws:// address from this page?","What does close code 1006 mean?","Can I send binary data?","How do I connect with a subprotocol?"],"features":["Runs in the browser","No login required"],"id":"websocket-tester","keywords":["websocket","ws","wss","socket","test","client","realtime","frames","subscribe","debug","postman"],"markdown_url":"https://ilham.dev/tools/websocket-tester/index.md","name":"WebSocket Tester","url":"https://ilham.dev/tools/websocket-tester/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/ipv6-expander/","category":"network","category_name":"Network","description":"Expand, compress and classify an IPv6 address, with prefix and embedded IPv4 support.","examples":["Why does the compressed form sometimes keep a zero group?","What is the difference between link-local, unique local and global?","What is an IPv4-mapped address?","Does the zone index change the address?"],"features":["Runs in the browser","No login required"],"id":"ipv6-expander","keywords":["ipv6","expand","compress","canonical","address","prefix","ip"],"markdown_url":"https://ilham.dev/tools/ipv6-expander/index.md","name":"IPv6 Expander","url":"https://ilham.dev/tools/ipv6-expander/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/http-header-parser/","category":"network","category_name":"Network","description":"Turn a pasted header block into a clean table, including cookies and repeated fields.","examples":["Why are some headers marked as repeated?","How are folded lines handled?","What is the status line?","Is anything sent over the network?"],"features":["Runs in the browser","No login required"],"id":"http-header-parser","keywords":["http","headers","parse","response","request","cookies","curl","devtools"],"markdown_url":"https://ilham.dev/tools/http-header-parser/index.md","name":"HTTP Header Parser","url":"https://ilham.dev/tools/http-header-parser/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/http-header-builder/","category":"network","category_name":"Network","description":"Build a tidy header block from key/value lines, with common security headers ready to add.","examples":["What makes a valid header name?","What happens if I list the same header twice?","Which security headers can I add?","Does the page send the headers anywhere?"],"features":["Runs in the browser","No login required"],"id":"http-header-builder","keywords":["http","headers","build","security","hsts","csp","request"],"markdown_url":"https://ilham.dev/tools/http-header-builder/index.md","name":"HTTP Header Builder","url":"https://ilham.dev/tools/http-header-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/websocket-frame-parser/","category":"network","category_name":"Network","description":"Decode a raw WebSocket frame from hex and explain its opcode, length and payload.","examples":["Where do I get the raw frame bytes?","Why is the payload scrambled?","What does the opcode mean?","Does this connect to a server?"],"features":["Runs in the browser","No login required"],"id":"websocket-frame-parser","keywords":["websocket","frame","parse","opcode","hex","ws","rfc6455"],"markdown_url":"https://ilham.dev/tools/websocket-frame-parser/index.md","name":"WebSocket Frame Parser","url":"https://ilham.dev/tools/websocket-frame-parser/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/port-reference/","category":"network","category_name":"Network","description":"Search the common TCP and UDP ports with their service names and a short description.","examples":["Is this a full list of every port?","Does a port number guarantee the service?","What is the difference between TCP and UDP for the same port?","Why are some dev-server ports listed as alternatives?"],"features":["Runs in the browser","No login required"],"id":"port-reference","keywords":["port","reference","tcp","udp","service","443","80","lookup"],"markdown_url":"https://ilham.dev/tools/port-reference/index.md","name":"Port Reference","url":"https://ilham.dev/tools/port-reference/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/ssh-tunnel-builder/","category":"network","category_name":"Network","description":"Assemble an ssh -L, -R or -D tunnel with the right ports, identity file and keepalive options, then copy the command.","examples":["What is the difference between -L, -R and -D?","Why are -f and -N on by default?","Does this connect for me?"],"features":["Runs in the browser","No login required"],"id":"ssh-tunnel-builder","keywords":["ssh","tunnel","port forward","local forward","remote forward","socks","proxy","bastion","command","linux"],"markdown_url":"https://ilham.dev/tools/ssh-tunnel-builder/index.md","name":"SSH Tunnel Builder","url":"https://ilham.dev/tools/ssh-tunnel-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/email-header-analyzer/","category":"network","category_name":"Network","description":"Parse raw email headers, list the delivery hops and show where the time went.","examples":["Why do the hops appear in a different order from the paste?","How is the delay between hops worked out?","What do the SPF, DKIM and DMARC values mean?","Can I use this to trace spam?"],"features":["Runs in the browser","No login required"],"id":"email-header-analyzer","keywords":["email","header","analyze","received","spam","delivery","hops","mail"],"markdown_url":"https://ilham.dev/tools/email-header-analyzer/index.md","name":"Email Header Analyzer","url":"https://ilham.dev/tools/email-header-analyzer/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/open-graph-debugger/","category":"network","category_name":"Network","description":"Extract Open Graph and Twitter Card tags from pasted HTML and preview the shared card.","examples":["Why does the preview look different from the real one?","Which title wins if several are present?","The image is missing from the preview. Why?","Is the page fetched for me?"],"features":["Runs in the browser","No login required"],"id":"open-graph-debugger","keywords":["open graph","og","twitter card","meta","social","preview","share","seo"],"markdown_url":"https://ilham.dev/tools/open-graph-debugger/index.md","name":"Open Graph Debugger","url":"https://ilham.dev/tools/open-graph-debugger/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/network-info/","category":"network","category_name":"Network","description":"Show what this browser exposes about its connection, device, screen and locale.","examples":["Why are some values blank?","How accurate is the downlink and round-trip time?","Does this reveal my IP address or location?","Why does the time zone matter?"],"features":["Runs in the browser","No login required"],"id":"network-info","keywords":["network","connection","online","downlink","rtt","device","browser","info"],"markdown_url":"https://ilham.dev/tools/network-info/index.md","name":"Network Info","url":"https://ilham.dev/tools/network-info/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/api-mock-response-builder/","category":"network","category_name":"Network","description":"Describe fields once and generate realistic mock JSON for an API response.","examples":["What types can I use?","How do I get a list of values in one field?","Are the values random every time?","Is the data based on anything real?"],"features":["Runs in the browser","No login required"],"id":"api-mock-response-builder","keywords":["api","mock","response","json","fake","sample","builder","stub"],"markdown_url":"https://ilham.dev/tools/api-mock-response-builder/index.md","name":"API Mock Response Builder","url":"https://ilham.dev/tools/api-mock-response-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/webhook-tester/","category":"network","category_name":"Network","description":"Sign, verify and send a test webhook in the Stripe, GitHub or Shopify format.","examples":["Which providers are supported?","Why is the timestamp part of the signature?","Why does sending fail with a network error?","Is the secret safe?"],"features":["Runs in the browser","No login required"],"id":"webhook-tester","keywords":["webhook","hmac","signature","stripe","github","shopify","verify","test"],"markdown_url":"https://ilham.dev/tools/webhook-tester/index.md","name":"Webhook Tester","url":"https://ilham.dev/tools/webhook-tester/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/snap-signature/","category":"network","category_name":"Network","description":"Build, sign and verify the SHA256withRSA signature used by Bank Indonesia's SNAP BI standard.","examples":["What exactly is the string that gets signed?","Which key goes where?","Why is the body minified before hashing?","Is this the same as SHA256withRSA in Java or Node?","Can I use a production private key here?"],"features":["Runs in the browser","No login required"],"id":"snap-signature","keywords":["snap bi","bank indonesia snap","asymmetric signature","tanda tangan digital snap","verify snap signature","api banking indonesia"],"markdown_url":"https://ilham.dev/tools/snap-signature/index.md","name":"SNAP BI Asymmetric Signature","url":"https://ilham.dev/tools/snap-signature/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/linux-ops/","category":"devops","category_name":"DevOps","description":"Describe a Linux problem and get safe commands, flag explanations, a risk level and the next troubleshooting steps.","examples":["How to check which process uses port 8080?","How to find large files on Ubuntu?","Nginx returns 503, what should I check?","Which command shows memory usage per process?"],"features":["Runs in the browser","No login required"],"id":"linux-ops","keywords":["linux","ubuntu","shell","devops","server","networking","troubleshooting","docker","systemd","nginx","port","disk"],"markdown_url":"https://ilham.dev/tools/linux-ops/index.md","name":"Dev Ops","url":"https://ilham.dev/tools/linux-ops/","use_cases":["check which process uses a port","find what is filling the disk","debug an nginx 502 or 503","inspect a crash-looping Docker container","read journalctl and systemctl output","check memory pressure and swap"]},{"canonical_url":"https://ilham.dev/tools/systemd-service-builder/","category":"devops","category_name":"DevOps","description":"Generate a foreground application service with a non-root user, restart policy, environment file, and installation commands.","examples":["Does this install or start a service on my server?","Can I paste a shell command into the arguments field?","Which service types are supported?","Is an EnvironmentFile the same as sourcing a .env file?"],"features":["Generate a system-level Type=simple unit for a foreground application","Configure a non-root user and optional group and environment file","Quote literal arguments without shell execution or variable expansion","Download the unit and copy installation and log commands","Add optional network ordering and NoNewPrivileges and PrivateTmp"],"id":"systemd-service-builder","keywords":["systemd","service","unit","linux","deploy","restart","systemctl","journalctl","environment file","daemon"],"markdown_url":"https://ilham.dev/tools/systemd-service-builder/index.md","name":"systemd Service Builder","url":"https://ilham.dev/tools/systemd-service-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/tar-command-builder/","category":"devops","category_name":"DevOps","description":"Build GNU tar create, list, and extract commands with compression, excludes, path stripping, and overwrite warnings.","examples":["Does this work with the tar installed on macOS?","Is the archive path relative to the source base directory?","Does refusing overwrites make extracting an unknown archive safe?","Does the tool save paths or upload files?"],"features":["Generate GNU tar create, list, and extract commands","Choose creation compression and GNU tar exclude patterns","List an archive before extracting and optionally strip path components","Refuse existing extraction files by default and explain overwrite risks"],"id":"tar-command-builder","keywords":["tar","archive","extract","gzip","bzip2","xz","zstd","backup","exclude","linux","command","builder"],"markdown_url":"https://ilham.dev/tools/tar-command-builder/index.md","name":"tar Command Builder","url":"https://ilham.dev/tools/tar-command-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/rsync-command-builder/","category":"devops","category_name":"DevOps","description":"Build local or SSH directory transfers with dry-run, trailing-slash explanations, excludes, bandwidth limits, and guarded deletion.","examples":["What does the trailing slash on the source change?","Does dry-run avoid connecting to the remote server?","What does --delete remove?","What are the SSH-mode requirements?","Are the directory paths or SSH details stored?"],"features":["Generate local copy and SSH upload or download directory commands","Enable dry-run by default with a separate preview command","Explain directory versus contents source trailing-slash behavior","Require renewed acknowledgement before a real destination-deletion command","Configure excludes, checksums, compression, and bandwidth limits"],"id":"rsync-command-builder","keywords":["rsync","sync","transfer","copy","ssh","backup","dry run","delete","exclude","trailing slash","linux","command","builder"],"markdown_url":"https://ilham.dev/tools/rsync-command-builder/index.md","name":"rsync Command Builder","url":"https://ilham.dev/tools/rsync-command-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/find-command-builder/","category":"devops","category_name":"DevOps","description":"Assemble a find command with name, type, size, age and depth tests, then choose to print, delete or exec on each match.","examples":["Why does -delete deserve caution?","What is the null-separated option for?","Does the order of the options matter?"],"features":["Runs in the browser","No login required"],"id":"find-command-builder","keywords":["find","command","builder","shell","files","search","name","size","mtime","delete","exec","linux","bash"],"markdown_url":"https://ilham.dev/tools/find-command-builder/index.md","name":"find Command Builder","url":"https://ilham.dev/tools/find-command-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/xargs-builder/","category":"devops","category_name":"DevOps","description":"Build and explain an xargs command — null input, batch size, parallelism and a replace string, with a note on each flag.","examples":["Why pair -0 with find -print0?","What does -I do to -n?","Is it safe to run commands in parallel?"],"features":["Runs in the browser","No login required"],"id":"xargs-builder","keywords":["xargs","command","builder","shell","pipeline","parallel","stdin","find","bash","linux"],"markdown_url":"https://ilham.dev/tools/xargs-builder/index.md","name":"xargs Builder","url":"https://ilham.dev/tools/xargs-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/jwt-parser/","category":"web","category_name":"Web","description":"Decode, live-edit and verify JSON Web Tokens.","examples":["How do I read the claims in a JWT?","When does this token expire?"],"features":["Runs in the browser","No login required"],"id":"jwt-parser","keywords":["jwt","token","decode","parser","claims","auth","bearer","verify","signature","validate","hs256","rs256"],"markdown_url":"https://ilham.dev/tools/jwt-parser/index.md","name":"JWT Parser","url":"https://ilham.dev/tools/jwt-parser/","use_cases":["inspect a JWT without verifying it","check when a token expires"]},{"canonical_url":"https://ilham.dev/tools/jwt-editor/","category":"web","category_name":"Web","description":"Create, edit and sign JSON Web Tokens from header and payload JSON.","examples":["Does this verify a token, or only create one?","Which key formats can I paste in?","Why are the payload dates not shown as readable times?","Is a token I sign here safe to use?"],"features":["Runs in the browser","No login required"],"id":"jwt-editor","keywords":["jwt","token","encode","editor","sign","create","generate","claims","hs256","rs256","es256","none"],"markdown_url":"https://ilham.dev/tools/jwt-editor/index.md","name":"JWT Encode","url":"https://ilham.dev/tools/jwt-editor/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/jwt-expiry-editor/","category":"web","category_name":"Web","description":"Edit iat, nbf and exp claims on a JWT and re-sign it without touching JSON by hand.","examples":["The signature no longer verifies after editing — is that a bug?","Can it sign with RS256 or ES256?"],"features":["Runs in the browser","No login required"],"id":"jwt-expiry-editor","keywords":["jwt","expiry","exp","iat","nbf","token","claims","extend","refresh","sign"],"markdown_url":"https://ilham.dev/tools/jwt-expiry-editor/index.md","name":"JWT Expiry Editor","url":"https://ilham.dev/tools/jwt-expiry-editor/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/utm-builder/","category":"web","category_name":"Web","description":"Build and parse UTM campaign URLs with source, medium, campaign, term, content and id.","examples":["Does it shorten the URL?"],"features":["Runs in the browser","No login required"],"id":"utm-builder","keywords":["utm","campaign","marketing","analytics","url","source","medium","tracking"],"markdown_url":"https://ilham.dev/tools/utm-builder/index.md","name":"UTM Builder","url":"https://ilham.dev/tools/utm-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/url-parser/","category":"web","category_name":"Web","description":"Break a URL into its parts and query parameters.","examples":["Why is each parameter shown twice?","Why does a repeated parameter appear twice in the list?"],"features":["Runs in the browser","No login required"],"id":"url-parser","keywords":["url","parse","query","parameters","uri"],"markdown_url":"https://ilham.dev/tools/url-parser/index.md","name":"URL Parser","url":"https://ilham.dev/tools/url-parser/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/user-agent-parser/","category":"web","category_name":"Web","description":"Read the browser, engine, OS and device from a user-agent string.","examples":["Why is the browser detected wrongly?"],"features":["Runs in the browser","No login required"],"id":"user-agent-parser","keywords":["user agent","browser","os","device","parse"],"markdown_url":"https://ilham.dev/tools/user-agent-parser/index.md","name":"User Agent Parser","url":"https://ilham.dev/tools/user-agent-parser/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/mic-tester/","category":"web","category_name":"Web","description":"Check a microphone, watch its level and peak, and record a clip to play back or download.","examples":["Where does the recording go?","Why does the browser ask for permission?","What format is the clip saved in?","Why does the bar barely move when I speak?"],"features":["Runs in the browser","No login required"],"id":"mic-tester","keywords":["microphone","mic","audio","level","meter","test","input","dbfs","clipping","recording","recorder","voice","playback"],"markdown_url":"https://ilham.dev/tools/mic-tester/index.md","name":"Microphone Recorder","url":"https://ilham.dev/tools/mic-tester/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/openapi-viewer/","category":"web","category_name":"Web","description":"Read an OpenAPI or Swagger document and list its operations, parameters and responses.","examples":["Does it fetch my specification from a URL?","Which versions are supported?","How deep does a schema go?"],"features":["Runs in the browser","No login required"],"id":"openapi-viewer","keywords":["openapi","swagger","api","specification","endpoints","schema","rest","documentation","viewer","yaml"],"markdown_url":"https://ilham.dev/tools/openapi-viewer/index.md","name":"OpenAPI Viewer","url":"https://ilham.dev/tools/openapi-viewer/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/mime-types/","category":"web","category_name":"Web","description":"Look up the MIME type for a file extension.","examples":["Why does one extension have two types?"],"features":["Runs in the browser","No login required"],"id":"mime-types","keywords":["mime","content type","extension","file"],"markdown_url":"https://ilham.dev/tools/mime-types/index.md","name":"MIME Types","url":"https://ilham.dev/tools/mime-types/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/http-status-codes/","category":"web","category_name":"Web","description":"Reference list of HTTP response status codes and their meaning.","examples":["When should I return 401 instead of 403?","Does 200 always mean success?"],"features":["Runs in the browser","No login required"],"id":"http-status-codes","keywords":["http","status","code","response","reference"],"markdown_url":"https://ilham.dev/tools/http-status-codes/index.md","name":"HTTP Status Codes","url":"https://ilham.dev/tools/http-status-codes/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/meta-tag-generator/","category":"web","category_name":"Web","description":"Generate HTML meta tags for a page.","examples":["How long should a meta description be?","Do Open Graph tags affect ranking?"],"features":["Runs in the browser","No login required"],"id":"meta-tag-generator","keywords":["meta","tag","seo","open graph","html"],"markdown_url":"https://ilham.dev/tools/meta-tag-generator/index.md","name":"Meta Tag Generator","url":"https://ilham.dev/tools/meta-tag-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/keycode-info/","category":"web","category_name":"Web","description":"Press a key to see its code, key and modifier state.","examples":["Why is keyCode deprecated?"],"features":["Runs in the browser","No login required"],"id":"keycode-info","keywords":["keycode","key","keyboard","event","code","shortcut"],"markdown_url":"https://ilham.dev/tools/keycode-info/index.md","name":"Keycode Info","url":"https://ilham.dev/tools/keycode-info/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/slugify/","category":"web","category_name":"Web","description":"Turn any text into a clean URL slug.","examples":["Why should a slug be ASCII?","Should I use dashes or underscores?"],"features":["Runs in the browser","No login required"],"id":"slugify","keywords":["slug","url","seo","kebab","case"],"markdown_url":"https://ilham.dev/tools/slugify/index.md","name":"Slugify","url":"https://ilham.dev/tools/slugify/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/otp-generator/","category":"web","category_name":"Web","description":"Generate and verify time-based one-time passwords.","examples":["Is my secret sent anywhere?","Why does the code not match my authenticator app?"],"features":["Runs in the browser","No login required"],"id":"otp-generator","keywords":["otp","totp","2fa","authenticator","code"],"markdown_url":"https://ilham.dev/tools/otp-generator/index.md","name":"OTP Generator","url":"https://ilham.dev/tools/otp-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/device-information/","category":"web","category_name":"Web","description":"Show what the browser reports about the current device.","examples":["Why is the reported platform sometimes wrong?"],"features":["Runs in the browser","No login required"],"id":"device-information","keywords":["device","browser","screen","platform","info","size"],"markdown_url":"https://ilham.dev/tools/device-information/index.md","name":"Device Information","url":"https://ilham.dev/tools/device-information/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/qr-code-generator/","category":"web","category_name":"Web","description":"Generate a QR code from text or a URL.","examples":["Do I need an account, or is there a limit?","Which error-correction level should I choose?","Why did the PNG download fail?","How large can a logo be before the code stops scanning?"],"features":["Runs in the browser","No login required"],"id":"qr-code-generator","keywords":["qr","code","barcode","generate"],"markdown_url":"https://ilham.dev/tools/qr-code-generator/index.md","name":"QR Code Generator","url":"https://ilham.dev/tools/qr-code-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/wifi-qr-generator/","category":"web","category_name":"Web","description":"Build a QR code that joins a Wi-Fi network.","examples":["Does it work on an iPhone?","Is it safe to print the password in a QR code?","Which security type should I pick?"],"features":["Runs in the browser","No login required"],"id":"wifi-qr-generator","keywords":["wifi","qr","network","ssid","password"],"markdown_url":"https://ilham.dev/tools/wifi-qr-generator/index.md","name":"Wi-Fi QR Code","url":"https://ilham.dev/tools/wifi-qr-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/qr-editor/","category":"web","category_name":"Web","description":"Restyle a QR code — module shapes, gradient colours, logo, transparent background.","examples":["How big can the logo be before the code stops scanning?","Why is the round finder corner called a dot rather than a circle?","What is the difference between this and the plain QR Code Generator?","Can I use an SVG file as the logo?"],"features":["Runs in the browser","No login required"],"id":"qr-editor","keywords":["qr","editor","style","design","logo","gradient","custom","rounded","dots","transparent"],"markdown_url":"https://ilham.dev/tools/qr-editor/index.md","name":"QR Code Editor","url":"https://ilham.dev/tools/qr-editor/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/sticker-maker/","category":"web","category_name":"Web","description":"Create PNG stickers with shapes, text decoration, outlines and simple background removal.","examples":["How good is the background removal?"],"features":["Runs in the browser","No login required"],"id":"sticker-maker","keywords":["sticker","image","remove background","png","circle","text","meme","design"],"markdown_url":"https://ilham.dev/tools/sticker-maker/index.md","name":"Sticker Maker","url":"https://ilham.dev/tools/sticker-maker/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/svg-placeholder/","category":"web","category_name":"Web","description":"Create a placeholder image as an SVG.","examples":["Why SVG rather than a PNG?"],"features":["Runs in the browser","No login required"],"id":"svg-placeholder","keywords":["svg","placeholder","image","mockup"],"markdown_url":"https://ilham.dev/tools/svg-placeholder/index.md","name":"SVG Placeholder","url":"https://ilham.dev/tools/svg-placeholder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/camera-recorder/","category":"web","category_name":"Web","description":"Record a short video from the webcam in the browser.","examples":["Why can it not reach my camera?","Where does the recording go?"],"features":["Runs in the browser","No login required"],"id":"camera-recorder","keywords":["camera","recorder","webcam","video","mediarecorder"],"markdown_url":"https://ilham.dev/tools/camera-recorder/index.md","name":"Camera Recorder","url":"https://ilham.dev/tools/camera-recorder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/image-metadata/","category":"web","category_name":"Web","description":"Read the EXIF, GPS, comments and colour data hidden inside a photo, without uploading it.","examples":["Why does my image show no EXIF at all?","Is the GPS location exact?","Can it remove metadata?","Which formats are supported, and why those four?"],"features":["Runs in the browser","No login required"],"id":"image-metadata","keywords":["exif","metadata","image","photo","gps","location","camera","jpeg","png","webp","gif","xmp","iptc","hidden data","geotag"],"markdown_url":"https://ilham.dev/tools/image-metadata/index.md","name":"Image Metadata Viewer","url":"https://ilham.dev/tools/image-metadata/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/image-compressor/","category":"web","category_name":"Web","description":"Resize and re-encode an image in the browser — cap its dimensions, pick a format and quality, then download the smaller file.","examples":["Does compressing remove the metadata?","Why did my translucent PNG turn black or white?","The file got bigger instead of smaller — why?","Is there a size limit?"],"features":["Runs in the browser","No login required"],"id":"image-compressor","keywords":["image","compress","resize","optimize","jpeg","png","webp","gif","quality","shrink","scale","downsize","thumbnail","strip metadata","exif","canvas"],"markdown_url":"https://ilham.dev/tools/image-compressor/index.md","name":"Image Compressor","url":"https://ilham.dev/tools/image-compressor/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/exif-remover/","category":"web","category_name":"Web","description":"Strip EXIF, GPS and other hidden metadata from a photo by re-encoding it in the browser.","examples":["Does re-encoding change how the picture looks?","Why does the file sometimes get bigger?","Is the metadata really gone?"],"features":["Runs in the browser","No login required"],"id":"exif-remover","keywords":["exif","remove","strip","metadata","gps","privacy","photo","image","clean","anonymise","scrubbing"],"markdown_url":"https://ilham.dev/tools/exif-remover/index.md","name":"EXIF Remover","url":"https://ilham.dev/tools/exif-remover/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/image-format-converter/","category":"web","category_name":"Web","description":"Convert a picture between JPEG, PNG, WebP and AVIF, with a quality slider and a before-and-after size.","examples":["Why is AVIF marked as not supported?","What happens to transparency in a JPEG?","Which format should I pick?"],"features":["Runs in the browser","No login required"],"id":"image-format-converter","keywords":["image","convert","format","jpeg","png","webp","avif","transcode","encoder","quality","canvas"],"markdown_url":"https://ilham.dev/tools/image-format-converter/index.md","name":"Image Format Converter","url":"https://ilham.dev/tools/image-format-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/watermark-tool/","category":"web","category_name":"Web","description":"Draw a text watermark onto a picture, choosing the corner, size, colour and opacity.","examples":["How large should the watermark be?","Why is there a dark outline?","Can someone remove the watermark?"],"features":["Runs in the browser","No login required"],"id":"watermark-tool","keywords":["watermark","text","copyright","stamp","image","photo","brand","overlay","signature","canvas"],"markdown_url":"https://ilham.dev/tools/watermark-tool/index.md","name":"Watermark Tool","url":"https://ilham.dev/tools/watermark-tool/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/photo-target-resizer/","category":"web","category_name":"Web","description":"Shrink a photo until it fits a size in kilobytes, keeping the highest quality that still fits.","examples":["How is the right quality found?","What if the limit is too small?","Which format comes out?"],"features":["Runs in the browser","No login required"],"id":"photo-target-resizer","keywords":["resize","photo","target size","kb","compress","limit","upload","quality","jpeg","webp","form"],"markdown_url":"https://ilham.dev/tools/photo-target-resizer/index.md","name":"Photo Resizer by Target Size","url":"https://ilham.dev/tools/photo-target-resizer/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/screenshot-privacy-cleaner/","category":"web","category_name":"Web","description":"Pixelate or black out parts of a screenshot before sharing it.","examples":["Does it find the sensitive parts for me?","Is pixelating as safe as a black box?","Can I take a redaction back?"],"features":["Runs in the browser","No login required"],"id":"screenshot-privacy-cleaner","keywords":["screenshot","privacy","redact","pixelate","blur","censor","black out","mask","anonymise","image"],"markdown_url":"https://ilham.dev/tools/screenshot-privacy-cleaner/index.md","name":"Screenshot Privacy Cleaner","url":"https://ilham.dev/tools/screenshot-privacy-cleaner/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/background-remover/","category":"web","category_name":"Web","description":"Clear a plain background from an image by flooding in from the edges.","examples":["Will this work on a photo with a busy background?","Why is part of the subject disappearing?","What happens to the parts that are left?"],"features":["Runs in the browser","No login required"],"id":"background-remover","keywords":["background","remove","transparent","cutout","png","alpha","magic wand","flood fill","photo","product"],"markdown_url":"https://ilham.dev/tools/background-remover/index.md","name":"Background Remover","url":"https://ilham.dev/tools/background-remover/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/zip-builder/","category":"web","category_name":"Web","description":"Bundle several files into a zip archive in the browser, with a choice of compression level.","examples":["Why do two files with the same name both survive?","Which compression level should I use?","Is there a size limit?"],"features":["Runs in the browser","No login required"],"id":"zip-builder","keywords":["zip","archive","compress","bundle","files","download","package","store","deflate"],"markdown_url":"https://ilham.dev/tools/zip-builder/index.md","name":"Zip Builder","url":"https://ilham.dev/tools/zip-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/pdf-info/","category":"web","category_name":"Web","description":"Read a PDF to see its page count, page sizes, version and document information.","examples":["What are the point and millimetre figures?","Why is some document information missing?","Can it read an encrypted PDF?"],"features":["Runs in the browser","No login required"],"id":"pdf-info","keywords":["pdf","page count","info","metadata","size","pages","version","details","inspect"],"markdown_url":"https://ilham.dev/tools/pdf-info/index.md","name":"PDF Page Counter and Info","url":"https://ilham.dev/tools/pdf-info/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/pdf-page-extractor/","category":"web","category_name":"Web","description":"Keep only the pages you choose from a PDF and download the rest as a new file.","examples":["How do I write a page range?","Does the original file change?","Do links and form fields survive?"],"features":["Runs in the browser","No login required"],"id":"pdf-page-extractor","keywords":["pdf","extract","pages","split","delete pages","keep","remove","range","document"],"markdown_url":"https://ilham.dev/tools/pdf-page-extractor/index.md","name":"PDF Page Extractor","url":"https://ilham.dev/tools/pdf-page-extractor/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/pdf-merger/","category":"web","category_name":"Web","description":"Join several PDFs into one document, in the order you set.","examples":["Can I merge PDFs with different page sizes?","What happens if one file cannot be read?","Is the order the order I selected them in?"],"features":["Runs in the browser","No login required"],"id":"pdf-merger","keywords":["pdf","merge","combine","join","concatenate","append","documents","order"],"markdown_url":"https://ilham.dev/tools/pdf-merger/index.md","name":"PDF Merger","url":"https://ilham.dev/tools/pdf-merger/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/text-to-pdf/","category":"web","category_name":"Web","description":"Write plain text out as a PDF, with wrapping, page size, margins and page numbers.","examples":["Which characters can be drawn?","How does the wrapping work?","Can I use my own font?"],"features":["Runs in the browser","No login required"],"id":"text-to-pdf","keywords":["pdf","text","write","convert","document","page size","print","wrap","generator"],"markdown_url":"https://ilham.dev/tools/text-to-pdf/index.md","name":"Text to PDF","url":"https://ilham.dev/tools/text-to-pdf/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/html-wysiwyg-editor/","category":"web","category_name":"Web","description":"A small rich-text editor that exports clean HTML.","examples":["Is the generated HTML clean?"],"features":["Runs in the browser","No login required"],"id":"html-wysiwyg-editor","keywords":["html","editor","wysiwyg","rich text"],"markdown_url":"https://ilham.dev/tools/html-wysiwyg-editor/index.md","name":"HTML Editor","url":"https://ilham.dev/tools/html-wysiwyg-editor/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/javascript-playground/","category":"web","category_name":"Web","description":"Run JavaScript in your browser with live console output, interactive input, optional auto-run and a stoppable Web Worker.","examples":["Why does the Monaco editor not appear straight away?","Can I use top-level await?","Is the code sandboxed?","Why did my console.log output not appear?","Can I edit other languages?","Does it remember my code between visits?"],"features":["Live console output","Interactive async prompt","Run and Stop","Optional auto-run","Coding exercises and pyramid patterns"],"id":"javascript-playground","keywords":["javascript","js","playground","run","console","snippet","test","es6","monaco","editor","syntax highlighting","auto-run","prompt","web worker","prime numbers","pyramid","coding exercises"],"markdown_url":"https://ilham.dev/tools/javascript-playground/index.md","name":"JavaScript Playground","url":"https://ilham.dev/tools/javascript-playground/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/typescript-playground/","category":"web","category_name":"Web","description":"Transpile TypeScript and run it in your browser with live console output, interactive input and coding examples.","examples":["Does this check TypeScript types?","Can I use await and interactive input?","Does clicking an example run it?","Can I import npm packages?","What happens when code never finishes?"],"features":["Browser-side transpilation","Syntax diagnostics","Interactive async prompt","Run and Stop","Coding exercises and pyramid patterns"],"id":"typescript-playground","keywords":["typescript","ts","playground","transpile","compiler","console","interface","generics","coding exercises","prime numbers","pyramid"],"markdown_url":"https://ilham.dev/tools/typescript-playground/index.md","name":"TypeScript Playground","url":"https://ilham.dev/tools/typescript-playground/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/python-playground/","category":"web","category_name":"Web","description":"Run Python in your browser with Pyodide, interactive or prepared input, console output and coding examples.","examples":["How does input() work?","Why does the first Run take longer?","Can I use pip or any Python package?","Does choosing an example erase my code?","Is this a security sandbox?"],"features":["Pyodide browser runtime","Interactive terminal input","Prepared standard input","Run and Stop","Coding exercises and pyramid patterns"],"id":"python-playground","keywords":["python","py","playground","pyodide","wasm","interpreter","stdin","coding exercises","prime numbers","pyramid"],"markdown_url":"https://ilham.dev/tools/python-playground/index.md","name":"Python Playground","url":"https://ilham.dev/tools/python-playground/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/ruby-playground/","category":"web","category_name":"Web","description":"Run Ruby in your browser with a WASI runtime, interactive or prepared input, console output and coding examples.","examples":["How do I read input?","Why does the first Run take longer?","Can I install gems or run Rails?","Does selecting an example erase my code?","Is this a security sandbox?"],"features":["Ruby WASI browser runtime","Interactive terminal input","Prepared standard input","Run and Stop","Coding exercises and pyramid patterns"],"id":"ruby-playground","keywords":["ruby","rb","playground","wasm","wasi","interpreter","stdin","coding exercises","prime numbers","pyramid","classes"],"markdown_url":"https://ilham.dev/tools/ruby-playground/index.md","name":"Ruby Playground","url":"https://ilham.dev/tools/ruby-playground/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/c-playground/","category":"web","category_name":"Web","description":"Compile and run C in your browser with a WASI Clang toolchain, interactive or prepared input, console output and coding examples.","examples":["How do I read input?","Why does the first Run take longer?","Can I use exceptions, threads, fork or sockets?","Does selecting an example erase my code?","Is this a security sandbox?"],"features":["Browser-side Clang compile to WebAssembly","Interactive terminal input","Prepared standard input","Run and Stop","Coding exercises and pyramid patterns"],"id":"c-playground","keywords":["c","clang","playground","compiler","wasm","wasi","stdin","coding exercises","prime numbers","pyramid","structs"],"markdown_url":"https://ilham.dev/tools/c-playground/index.md","name":"C Playground","url":"https://ilham.dev/tools/c-playground/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/cpp-playground/","category":"web","category_name":"Web","description":"Compile and run C++ in your browser with a WASI Clang toolchain, interactive or prepared input, console output and coding examples.","examples":["How do I read input?","Why does the first Run take longer?","Can I use exceptions, threads or the full standard library?","Does selecting an example erase my code?","Is this a security sandbox?"],"features":["Browser-side Clang compile to WebAssembly","Interactive terminal input","Prepared standard input","Run and Stop","Coding exercises and pyramid patterns"],"id":"cpp-playground","keywords":["c++","cpp","clang","playground","compiler","wasm","wasi","stdin","coding exercises","prime numbers","pyramid","classes","templates"],"markdown_url":"https://ilham.dev/tools/cpp-playground/index.md","name":"C++ Playground","url":"https://ilham.dev/tools/cpp-playground/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/whatsapp-link-generator/","category":"web","category_name":"Web","description":"Turn a phone number and a message into a wa.me click-to-chat link.","examples":["Why is the leading zero removed?","Does the message have to be encoded?","Can I shorten the link?"],"features":["Runs in the browser","No login required"],"id":"whatsapp-link-generator","keywords":["whatsapp","wa.me","click to chat","link","phone","message","generator","wa"],"markdown_url":"https://ilham.dev/tools/whatsapp-link-generator/index.md","name":"WhatsApp Link Generator","url":"https://ilham.dev/tools/whatsapp-link-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/nginx-config-generator/","category":"workflow","category_name":"Workflow","description":"Build an nginx server block for a static site, a single-page app, PHP or a reverse proxy.","examples":["How do I proxy /api to localhost:3000?","What is a safe nginx config for a static site?"],"features":["Runs in the browser","No login required"],"id":"nginx-config-generator","keywords":["nginx","config","server block","reverse proxy","vhost","tls","ssl","spa","php","gzip","upstream","webserver"],"markdown_url":"https://ilham.dev/tools/nginx-config-generator/index.md","name":"nginx Config Generator","url":"https://ilham.dev/tools/nginx-config-generator/","use_cases":["generate an nginx server block","add a reverse proxy with TLS","set up gzip and caching"]},{"canonical_url":"https://ilham.dev/tools/nginx-reverse-proxy-wizard/","category":"workflow","category_name":"Workflow","description":"Step through domain, upstream, TLS and extras to get a reverse proxy server block.","examples":["How do I set up a reverse proxy with WebSocket support?","Why do I get 502 Bad Gateway from nginx?"],"features":["Runs in the browser","No login required"],"id":"nginx-reverse-proxy-wizard","keywords":["nginx","reverse proxy","wizard","upstream","load balancing","websocket","sse","tls","ssl","keepalive"],"markdown_url":"https://ilham.dev/tools/nginx-reverse-proxy-wizard/index.md","name":"nginx Reverse Proxy Wizard","url":"https://ilham.dev/tools/nginx-reverse-proxy-wizard/","use_cases":["add a reverse proxy step by step","fix common proxy errors"]},{"canonical_url":"https://ilham.dev/tools/crontab-generator/","category":"workflow","category_name":"Workflow","description":"Build a cron expression and read it back in plain language.","examples":["Is `0 0 * * *` always midnight UTC?","Does this schedule the job?"],"features":["Runs in the browser","No login required"],"id":"crontab-generator","keywords":["cron","crontab","schedule","expression"],"markdown_url":"https://ilham.dev/tools/crontab-generator/index.md","name":"Crontab Generator","url":"https://ilham.dev/tools/crontab-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/chmod-calculator/","category":"workflow","category_name":"Workflow","description":"Convert between octal and symbolic Unix file permissions.","examples":["What is the difference between 644 and 755?","What does a leading digit mean?"],"features":["Runs in the browser","No login required"],"id":"chmod-calculator","keywords":["chmod","permissions","unix","octal","symbolic"],"markdown_url":"https://ilham.dev/tools/chmod-calculator/index.md","name":"chmod Calculator","url":"https://ilham.dev/tools/chmod-calculator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/docker-run-to-compose/","category":"workflow","category_name":"Workflow","description":"Turn a docker run command into a docker-compose service.","examples":["Does it understand every flag?"],"features":["Runs in the browser","No login required"],"id":"docker-run-to-compose","keywords":["docker","compose","run","convert","yaml"],"markdown_url":"https://ilham.dev/tools/docker-run-to-compose/index.md","name":"Docker Run to Compose","url":"https://ilham.dev/tools/docker-run-to-compose/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/docker-logs-grep/","category":"workflow","category_name":"Workflow","description":"Filter docker compose logs with grep-style context, invert and dedupe modes.","examples":["How do I get 10 lines before and 5 lines after a match?","What is the difference between Regex and plain search?","Can I dedupe a noisy log?"],"features":["Runs in the browser","No login required"],"id":"docker-logs-grep","keywords":["docker","compose","logs","grep","filter","context","log"],"markdown_url":"https://ilham.dev/tools/docker-logs-grep/index.md","name":"Docker Logs Grep","url":"https://ilham.dev/tools/docker-logs-grep/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/log-redactor/","category":"workflow","category_name":"Workflow","description":"Redact common sensitive fields, private-key blocks, URL credentials, JWT-like tokens, emails, and IPs before manually reviewing logs for sharing.","examples":["Does the tool guarantee that no secrets remain?","Why did it remove the rest of a line or the remaining log?","Are the original logs stored or uploaded?","Does exact-text matching support regex or ignore case?"],"features":["Replace common sensitive-field lines and PEM private-key blocks","Detect URL credentials, JWT-like tokens, common emails, IPv4, and IPv6","Add case-sensitive exact-text redactions without regex","Preview results and overlapping per-category match counts","Copy or download only the redacted preview"],"id":"log-redactor","keywords":["log","redact","mask","sanitize","secrets","token","authorization","cookie","password","email","ip","privacy","anonymize"],"markdown_url":"https://ilham.dev/tools/log-redactor/index.md","name":"Log Redactor","url":"https://ilham.dev/tools/log-redactor/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/log-parser/","category":"workflow","category_name":"Workflow","description":"Parse JSON Lines, Apache/Nginx access logs, syslog, logfmt and plain logs into a searchable table.","examples":["How does auto-detect choose a format?","What happens to a line that does not match the chosen format?","How are timestamps normalised?","How are log levels mapped?"],"features":["Runs in the browser","No login required"],"id":"log-parser","keywords":["log","parser","json lines","syslog","logfmt","nginx","apache","access log","structured","level"],"markdown_url":"https://ilham.dev/tools/log-parser/index.md","name":"Log Parser","url":"https://ilham.dev/tools/log-parser/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/dockerfile-builder/","category":"workflow","category_name":"Workflow","description":"Build a Dockerfile from a form, with multi-stage presets for Node, Python, Go, Nginx and more.","examples":["When is a multi-stage build worth it?","What is the difference between ENTRYPOINT and CMD?","Why order the instructions this way?","COPY or ADD?"],"features":["Runs in the browser","No login required"],"id":"dockerfile-builder","keywords":["docker","dockerfile","builder","container","image","multi-stage","node","python","go","nginx","entrypoint","cmd"],"markdown_url":"https://ilham.dev/tools/dockerfile-builder/index.md","name":"Dockerfile Builder","url":"https://ilham.dev/tools/dockerfile-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/git-cheatsheet/","category":"workflow","category_name":"Workflow","description":"A quick reference of the Git commands I keep forgetting.","examples":["Is it safe to run these commands?"],"features":["Runs in the browser","No login required"],"id":"git-cheatsheet","keywords":["git","cheatsheet","reference","commands"],"markdown_url":"https://ilham.dev/tools/git-cheatsheet/index.md","name":"Git Cheatsheet","url":"https://ilham.dev/tools/git-cheatsheet/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/regex-tester/","category":"workflow","category_name":"Workflow","description":"Test a regular expression against sample text with live matches.","examples":["Why does my pattern behave differently in Python or grep?","Why does .* match more than I expected?"],"features":["Runs in the browser","No login required"],"id":"regex-tester","keywords":["regex","regexp","test","match","pattern"],"markdown_url":"https://ilham.dev/tools/regex-tester/index.md","name":"Regex Tester","url":"https://ilham.dev/tools/regex-tester/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/regex-replace-tester/","category":"workflow","category_name":"Workflow","description":"Preview regex find-and-replace results with capture group references and live highlighting.","examples":["Why do I get no replacements with a non-global flag?"],"features":["Runs in the browser","No login required"],"id":"regex-replace-tester","keywords":["regex","replace","substitute","find and replace","capture group","preview"],"markdown_url":"https://ilham.dev/tools/regex-replace-tester/index.md","name":"Regex Replace Tester","url":"https://ilham.dev/tools/regex-replace-tester/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/cron-next-runs/","category":"workflow","category_name":"Workflow","description":"Preview the next scheduled runs of a cron expression in local time or UTC.","examples":["What does 0 3 * * * mean?","When does */15 9-17 * * 1-5 run next?"],"features":["Runs in the browser","No login required"],"id":"cron-next-runs","keywords":["cron","crontab","next runs","schedule","preview","utc"],"markdown_url":"https://ilham.dev/tools/cron-next-runs/index.md","name":"Cron Next Runs","url":"https://ilham.dev/tools/cron-next-runs/","use_cases":["explain a cron expression","see the next run times","check a crontab schedule"]},{"canonical_url":"https://ilham.dev/tools/regex-cheatsheet/","category":"workflow","category_name":"Workflow","description":"A quick reference of regular-expression syntax.","examples":["Which dialect does this describe?"],"features":["Runs in the browser","No login required"],"id":"regex-cheatsheet","keywords":["regex","cheatsheet","reference","syntax"],"markdown_url":"https://ilham.dev/tools/regex-cheatsheet/index.md","name":"Regex Cheatsheet","url":"https://ilham.dev/tools/regex-cheatsheet/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/json-diff/","category":"workflow","category_name":"Workflow","description":"Compare two JSON documents and highlight the differences.","examples":["Does key order count as a difference?","Can it merge the two documents?"],"features":["Runs in the browser","No login required"],"id":"json-diff","keywords":["json","diff","compare","difference"],"markdown_url":"https://ilham.dev/tools/json-diff/index.md","name":"JSON Diff","url":"https://ilham.dev/tools/json-diff/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/text-diff/","category":"workflow","category_name":"Workflow","description":"Compare two blocks of text line by line.","examples":["Does it compare word by word?","Is there a version for structured data?"],"features":["Runs in the browser","No login required"],"id":"text-diff","keywords":["text","diff","compare","difference"],"markdown_url":"https://ilham.dev/tools/text-diff/index.md","name":"Text Diff","url":"https://ilham.dev/tools/text-diff/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/timestamp-converter/","category":"workflow","category_name":"Workflow","description":"Convert between Unix timestamps, ISO strings and local time.","examples":["Is my timestamp in seconds or milliseconds?","Why is my date off by a day?"],"features":["Runs in the browser","No login required"],"id":"timestamp-converter","keywords":["timestamp","unix","epoch","date","time","iso"],"markdown_url":"https://ilham.dev/tools/timestamp-converter/index.md","name":"Timestamp Converter","url":"https://ilham.dev/tools/timestamp-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/time-zone-converter/","category":"workflow","category_name":"Workflow","description":"Read a log timestamp in one zone and see the same moment in UTC, Jakarta and others.","examples":["Why is the default source UTC?","Which input formats are understood?","How do daylight-saving changes affect the result?"],"features":["Runs in the browser","No login required"],"id":"time-zone-converter","keywords":["timezone","time zone","utc","jakarta","convert","offset","log","timestamp"],"markdown_url":"https://ilham.dev/tools/time-zone-converter/index.md","name":"Time Zone Converter","url":"https://ilham.dev/tools/time-zone-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/lorem-ipsum/","category":"text","category_name":"Text","description":"Generate placeholder paragraphs, sentences or words.","examples":["Why not just write the real copy first?","Is the Latin real?"],"features":["Runs in the browser","No login required"],"id":"lorem-ipsum","keywords":["lorem","ipsum","placeholder","dummy","text"],"markdown_url":"https://ilham.dev/tools/lorem-ipsum/index.md","name":"Lorem Ipsum","url":"https://ilham.dev/tools/lorem-ipsum/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/text-statistics/","category":"text","category_name":"Text","description":"Count characters, words, sentences, lines and reading time.","examples":["How is the reading time worked out?"],"features":["Runs in the browser","No login required"],"id":"text-statistics","keywords":["text","statistics","count","words","characters"],"markdown_url":"https://ilham.dev/tools/text-statistics/index.md","name":"Text Statistics","url":"https://ilham.dev/tools/text-statistics/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/emoji-picker/","category":"text","category_name":"Text","description":"Search emoji by name and copy them.","examples":["Why do some emoji render as boxes?"],"features":["Runs in the browser","No login required"],"id":"emoji-picker","keywords":["emoji","search","picker","unicode"],"markdown_url":"https://ilham.dev/tools/emoji-picker/index.md","name":"Emoji Picker","url":"https://ilham.dev/tools/emoji-picker/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/numeronym/","category":"text","category_name":"Text","description":"Turn long words into numeronyms like i18n.","examples":["Why is it called a numeronym?"],"features":["Runs in the browser","No login required"],"id":"numeronym","keywords":["numeronym","abbreviation","i18n","word"],"markdown_url":"https://ilham.dev/tools/numeronym/index.md","name":"Numeronym","url":"https://ilham.dev/tools/numeronym/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/ascii-text-drawer/","category":"text","category_name":"Text","description":"Render text as large ASCII-art banners.","examples":["Will the banner line up everywhere?"],"features":["Runs in the browser","No login required"],"id":"ascii-text-drawer","keywords":["ascii","art","banner","figlet","text"],"markdown_url":"https://ilham.dev/tools/ascii-text-drawer/index.md","name":"ASCII Text","url":"https://ilham.dev/tools/ascii-text-drawer/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/case-converter/","category":"text","category_name":"Text","description":"Switch text between camelCase, snake_case, kebab-case and more.","examples":["How does it split words that are already joined together?"],"features":["Runs in the browser","No login required"],"id":"case-converter","keywords":["case","camel","snake","kebab","pascal","convert"],"markdown_url":"https://ilham.dev/tools/case-converter/index.md","name":"Case Converter","url":"https://ilham.dev/tools/case-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/line-comma-formatter/","category":"text","category_name":"Text","description":"Add commas, quotes, arrays or SQL IN formatting to one-item-per-line lists.","examples":["Can it keep blank lines?"],"features":["Runs in the browser","No login required"],"id":"line-comma-formatter","keywords":["list","comma","lines","quote","array","sql in","csv","formatter"],"markdown_url":"https://ilham.dev/tools/line-comma-formatter/index.md","name":"Line Comma Formatter","url":"https://ilham.dev/tools/line-comma-formatter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/env-diff-checker/","category":"text","category_name":"Text","description":"Compare two .env configurations for missing keys, changed values, and empty values, with result values hidden by default.","examples":["Does this tool save or upload my .env files?","Does it expand variables or understand every dotenv format?","Does the copied report contain secrets?"],"features":["Compare missing, changed, unchanged, and empty values","Hide result values by default","Copy a key-only report","Reject duplicate keys and unsupported syntax"],"id":"env-diff-checker","keywords":["env","dotenv","environment","variables","config","diff","compare","staging","production","missing keys","secrets"],"markdown_url":"https://ilham.dev/tools/env-diff-checker/index.md","name":".env Diff Checker","url":"https://ilham.dev/tools/env-diff-checker/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/env-key-sorter/","category":"text","category_name":"Text","description":"Sort the keys in a .env file alphabetically, keeping each comment with its key and optionally dropping duplicates or aligning values.","examples":["Does it change the values?","Which duplicate value wins?","Is my file uploaded?","Does it understand export?"],"features":["Runs in the browser","No login required"],"id":"env-key-sorter","keywords":["env","dotenv","environment","variables","config","sort","keys","alphabetical","order","duplicates","align","secrets"],"markdown_url":"https://ilham.dev/tools/env-key-sorter/index.md","name":".env Key Sorter","url":"https://ilham.dev/tools/env-key-sorter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/sed-simulator/","category":"text","category_name":"Text","description":"Simulate substitutions, line deletion, and selected-line printing on pasted ASCII text with a bounded browser-side regex subset.","examples":["Is this GNU sed running in the browser?","Can I use captured groups in the replacement?","Does this overwrite my original text or save it?","What are the simulation limits?"],"features":["Simulate substitution, deleting matching lines, and printing matching lines","Choose first or global replacement, ignore case, and substitution-only printing","Insert the whole match with ampersand in replacements","Preserve the source and copy a separate output"],"id":"sed-simulator","keywords":["sed","simulator","simulation","preview","replace","substitution","delete lines","print lines","regex","stream editor","linux"],"markdown_url":"https://ilham.dev/tools/sed-simulator/index.md","name":"sed Simulator","url":"https://ilham.dev/tools/sed-simulator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/grep-simulator/","category":"text","category_name":"Text","description":"Simulate line filtering, context, counts, word matching, and matching-text output on pasted ASCII text without searching files.","examples":["Is this a complete GNU grep implementation?","Does count show matching occurrences or matching lines?","Why is there no output with invert and matching text only?","Is my text sent anywhere or stored?"],"features":["Simulate fixed-string, basic-regex, and extended-regex line searches","Apply ignore case, word boundaries, inversion, context, counts, and matching-text output","Use leftmost-longest whole matches within the documented subset","Report selected-line counts and simulated grep exit status"],"id":"grep-simulator","keywords":["grep","simulator","simulation","preview","filter","search","context","invert","count lines","fixed string","regex","linux"],"markdown_url":"https://ilham.dev/tools/grep-simulator/index.md","name":"grep Simulator","url":"https://ilham.dev/tools/grep-simulator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/sed-replacement-builder/","category":"text","category_name":"Text","description":"Build a sed command to replace text, delete matching lines or print only matches, with in-place editing and backups.","examples":["Is an in-place edit reversible?","What does the I flag do?","Why does it quote the expression in single quotes?"],"features":["Runs in the browser","No login required"],"id":"sed-replacement-builder","keywords":["sed","replace","substitute","regex","command","builder","in-place","stream","editor","text","shell"],"markdown_url":"https://ilham.dev/tools/sed-replacement-builder/index.md","name":"sed Replacement Builder","url":"https://ilham.dev/tools/sed-replacement-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/grep-pattern-builder/","category":"text","category_name":"Text","description":"Build a grep command with the right regex style, recursion, includes and context lines, then copy it.","examples":["When should I use -F?","What is the difference between -E and -P?","How do I pass several extensions?"],"features":["Runs in the browser","No login required"],"id":"grep-pattern-builder","keywords":["grep","search","pattern","regex","command","builder","recursive","include","context","text","shell"],"markdown_url":"https://ilham.dev/tools/grep-pattern-builder/index.md","name":"grep Pattern Builder","url":"https://ilham.dev/tools/grep-pattern-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/currency-formatter/","category":"text","category_name":"Text","description":"Format a number as a currency amount with thousand separators and a symbol, in Indonesian or English style.","examples":["Why do the separators matter?","What does the decimal places box do?","Does it add a currency code?"],"features":["Runs in the browser","No login required"],"id":"currency-formatter","keywords":["currency","rupiah","amount","format","thousand separator","money","idr","usd","angka","format uang"],"markdown_url":"https://ilham.dev/tools/currency-formatter/index.md","name":"Currency Formatter","url":"https://ilham.dev/tools/currency-formatter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/number-to-words/","category":"text","category_name":"Text","description":"Spell an Indonesian number out in words, for invoices and receipts.","examples":["How is 1,250,000 read?","What about the number one?","How large a number can it handle?"],"features":["Runs in the browser","No login required"],"id":"number-to-words","keywords":["angka ke kata","terbilang","rupiah terbilang","indonesian number words","spell indonesian numbers","invoice amount in words"],"markdown_url":"https://ilham.dev/tools/number-to-words/index.md","name":"Number to Words","url":"https://ilham.dev/tools/number-to-words/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/typo-spotter/","category":"text","category_name":"Text","description":"Flag double spaces, stray spaces around punctuation, repeated words and informal Indonesian short forms.","examples":["Is this checking grammar?","Why does it flag text that looks fine?","Does anything leave the page?"],"features":["Runs in the browser","No login required"],"id":"typo-spotter","keywords":["typo bahasa indonesia","cek typo indonesia","ejaan indonesia","indonesian typo checker","spelling indonesia"],"markdown_url":"https://ilham.dev/tools/typo-spotter/index.md","name":"Typo Spotter","url":"https://ilham.dev/tools/typo-spotter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/whatsapp-formatter/","category":"text","category_name":"Text","description":"Format a WhatsApp message with bold, italic, strikethrough, monospace and lists, with a live preview.","examples":["Which markers does WhatsApp use?","Do the buttons need a selection?","Can the preview differ from WhatsApp?"],"features":["Runs in the browser","No login required"],"id":"whatsapp-formatter","keywords":["whatsapp","format","bold","italic","strikethrough","monospace","list","message","chat","wa"],"markdown_url":"https://ilham.dev/tools/whatsapp-formatter/index.md","name":"WhatsApp Message Formatter","url":"https://ilham.dev/tools/whatsapp-formatter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/base-converter/","category":"convert","category_name":"Convert","description":"Convert integers between binary, octal, decimal and hex.","examples":["Why does the value not change when I paste a very long number?","How are values above 9 written in base 36?"],"features":["Runs in the browser","No login required"],"id":"base-converter","keywords":["base","binary","octal","decimal","hex","convert"],"markdown_url":"https://ilham.dev/tools/base-converter/index.md","name":"Number Base Converter","url":"https://ilham.dev/tools/base-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/roman-numeral/","category":"convert","category_name":"Convert","description":"Convert between Roman numerals and decimal numbers.","examples":["Why does it stop at 3999?"],"features":["Runs in the browser","No login required"],"id":"roman-numeral","keywords":["roman","numeral","convert","number"],"markdown_url":"https://ilham.dev/tools/roman-numeral/index.md","name":"Roman Numerals","url":"https://ilham.dev/tools/roman-numeral/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/temperature-converter/","category":"convert","category_name":"Convert","description":"Convert between Celsius, Fahrenheit and Kelvin.","examples":["Is there a temperature where Celsius and Fahrenheit agree?"],"features":["Runs in the browser","No login required"],"id":"temperature-converter","keywords":["temperature","celsius","fahrenheit","kelvin","convert"],"markdown_url":"https://ilham.dev/tools/temperature-converter/index.md","name":"Temperature Converter","url":"https://ilham.dev/tools/temperature-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/color-converter/","category":"convert","category_name":"Convert","description":"Convert colors between HEX, RGB, HSL and more.","examples":["Why is the CMYK value approximate?","Does HSL use degrees?"],"features":["Runs in the browser","No login required"],"id":"color-converter","keywords":["color","hex","rgb","hsl","convert","picker"],"markdown_url":"https://ilham.dev/tools/color-converter/index.md","name":"Color Converter","url":"https://ilham.dev/tools/color-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/fuel-economy-converter/","category":"convert","category_name":"Convert","description":"Convert fuel economy between km/L, L/100 km and US or UK MPG.","examples":["Why are there two MPG values?","Which direction is better?","How is L/100 km converted?","What are the exact MPG factors?","Is the result rounded?"],"features":["Runs in the browser","No login required"],"id":"fuel-economy-converter","keywords":["fuel","economy","mileage","kmpl","l/100km","mpg","liters","consumption","convert"],"markdown_url":"https://ilham.dev/tools/fuel-economy-converter/index.md","name":"Fuel Economy Converter","url":"https://ilham.dev/tools/fuel-economy-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/cli-table-converter/","category":"convert","category_name":"Convert","description":"Turn aligned terminal output such as docker ps or df into a Markdown table, CSV or TSV.","examples":["Why does the automatic mode choose two spaces?","What happens to a pipe in the data?","Can I drop the header?"],"features":["Runs in the browser","No login required"],"id":"cli-table-converter","keywords":["cli","terminal","table","markdown","csv","tsv","convert","docker ps","df","columns"],"markdown_url":"https://ilham.dev/tools/cli-table-converter/index.md","name":"CLI Table Converter","url":"https://ilham.dev/tools/cli-table-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/maps-link-parser/","category":"convert","category_name":"Convert","description":"Pull the latitude and longitude out of a Google Maps link and export it as JSON, CSV, SQL or GeoJSON.","examples":["Why does a short link not work?","Which part of the link is used?","Why are the coordinates rounded?"],"features":["Runs in the browser","No login required"],"id":"maps-link-parser","keywords":["google maps","link","url","latitude","longitude","coordinates","gps","sql","json","csv","geojson","parse"],"markdown_url":"https://ilham.dev/tools/maps-link-parser/index.md","name":"Google Maps Link Parser","url":"https://ilham.dev/tools/maps-link-parser/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/math-evaluator/","category":"math","category_name":"Math","description":"Evaluate a mathematical expression, with variables and functions.","examples":["Is it safe to paste an expression in?"],"features":["Runs in the browser","No login required"],"id":"math-evaluator","keywords":["math","evaluate","expression","calculator"],"markdown_url":"https://ilham.dev/tools/math-evaluator/index.md","name":"Math Evaluator","url":"https://ilham.dev/tools/math-evaluator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/eta-calculator/","category":"math","category_name":"Math","description":"Estimate a finish time from progress, elapsed time and remaining work.","examples":["How accurate is it?"],"features":["Runs in the browser","No login required"],"id":"eta-calculator","keywords":["eta","estimate","progress","time"],"markdown_url":"https://ilham.dev/tools/eta-calculator/index.md","name":"ETA Calculator","url":"https://ilham.dev/tools/eta-calculator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/percentage-calculator/","category":"math","category_name":"Math","description":"Work out percentages, increases and decreases.","examples":["Why do a percentage rise and fall not cancel out?"],"features":["Runs in the browser","No login required"],"id":"percentage-calculator","keywords":["percentage","percent","increase","decrease","calculator"],"markdown_url":"https://ilham.dev/tools/percentage-calculator/index.md","name":"Percentage Calculator","url":"https://ilham.dev/tools/percentage-calculator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/interest-calculator/","category":"math","category_name":"Math","description":"Calculate deposit or loan interest after tax, with flat, effective, annuity, compound, tiered, step-up and floating methods.","examples":["What is the formula for simple interest?","What is the formula for compound interest?","How are tiered, step-up and floating interest calculated?","What is the difference between flat, effective and annuity?","Why does one month not equal one twelfth of the yearly rate?","Which parts are specific to Indonesia?"],"features":["Runs in the browser","No login required"],"id":"interest-calculator","keywords":["interest","bunga","deposito","obligasi","pajak","compound","anuitas","flat","efektif","tiered","step-up","floating","kredit","pinjaman"],"markdown_url":"https://ilham.dev/tools/interest-calculator/index.md","name":"Interest Calculator","url":"https://ilham.dev/tools/interest-calculator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/indonesian-tax-calculator/","category":"math","category_name":"Math","description":"Calculate selected Indonesian tax scenarios with exact arithmetic, rule references and explicit historical coverage limits.","examples":["Does this cover every Indonesian tax object and historical period?","What changes for VAT in 2025?","Why can the result contain a fraction of a rupiah?","Are my income or transaction amounts stored?"],"features":["Exact integer-fraction tax arithmetic with explicit PKP rounding","Selected audited income-tax scenarios through 2024-12-31","Corporate standard rates and Article 31E turnover allocation for calendar tax years 2009–2024","Selected 2025 domestic VAT scenarios with statutory rates, adjusted bases and retail transition","Search 193 reference object options by code or English or Indonesian name","Block unsupported dates and scenarios without a fallback rate"],"id":"indonesian-tax-calculator","keywords":["indonesian tax","pajak","kalkulator pajak","pph 21","pph 22","pph 23","pph final","pph 15","pph badan","corporate tax","pasal 31e","omzet","ppn","vat","ppnbm","tax object code","withholding","gross up","historical tax"],"markdown_url":"https://ilham.dev/tools/indonesian-tax-calculator/index.md","name":"Indonesian Tax Calculator","url":"https://ilham.dev/tools/indonesian-tax-calculator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/take-home-pay-calculator/","category":"math","category_name":"Math","description":"Estimate Indonesian net salary from gross pay, with PPh 21 and the employee share of BPJS broken out.","examples":["Which BPJS deductions come out of the salary?","Why can my payslip show a different monthly tax?","How is the bonus treated?","Is this the same as the payroll software of my company?"],"features":["Runs in the browser","No login required"],"id":"take-home-pay-calculator","keywords":["take home pay indonesia","gaji bersih","pph 21","bpjs","salary calculator indonesia","payroll indonesia"],"markdown_url":"https://ilham.dev/tools/take-home-pay-calculator/index.md","name":"Take-Home Pay Calculator","url":"https://ilham.dev/tools/take-home-pay-calculator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/loan-calculator/","category":"math","category_name":"Math","description":"Work out a fixed-rate loan payment, its amortisation schedule and the interest saved by paying extra.","examples":["How is the monthly instalment calculated?","Does paying extra lower my instalment?","Why is the total interest higher than I expected?","Does this cover a loan with a fixed period then a floating rate?"],"features":["Runs in the browser","No login required"],"id":"loan-calculator","keywords":["loan","kredit","pinjaman","mortgage","kpr","anuitas","amortisation","schedule","installment","cicilan","interest","extra payment","chart"],"markdown_url":"https://ilham.dev/tools/loan-calculator/index.md","name":"Loan Calculator","url":"https://ilham.dev/tools/loan-calculator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/date-calculator/","category":"math","category_name":"Math","description":"Add or subtract days, weeks, months and years, or measure the duration and business days between two dates.","examples":["Why is the calendar difference not just the total days?","Does including the end date change the calendar difference?","How are business days counted?","What happens when I add a month to 31 January?"],"features":["Runs in the browser","No login required"],"id":"date-calculator","keywords":["date","calculator","duration","difference","add","subtract","business days","working days","age","weeks","months","years"],"markdown_url":"https://ilham.dev/tools/date-calculator/index.md","name":"Date Calculator","url":"https://ilham.dev/tools/date-calculator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/chronometer/","category":"math","category_name":"Math","description":"A simple stopwatch with laps.","examples":["Does it keep running if I switch tabs?"],"features":["Runs in the browser","No login required"],"id":"chronometer","keywords":["stopwatch","timer","chronometer","laps"],"markdown_url":"https://ilham.dev/tools/chronometer/index.md","name":"Chronometer","url":"https://ilham.dev/tools/chronometer/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/benchmark-builder/","category":"math","category_name":"Math","description":"Compare a set of measured values and their ratios.","examples":["Can I use this to compare two snippets?"],"features":["Runs in the browser","No login required"],"id":"benchmark-builder","keywords":["benchmark","compare","ratio","performance"],"markdown_url":"https://ilham.dev/tools/benchmark-builder/index.md","name":"Benchmark Builder","url":"https://ilham.dev/tools/benchmark-builder/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/random-generator/","category":"math","category_name":"Math","description":"Pick from a list with a spin wheel, slot machine, random card, dice or ticker animation.","examples":["Is the animation deciding the result?","Can I pick multiple winners?"],"features":["Runs in the browser","No login required"],"id":"random-generator","keywords":["random","picker","generator","wheel","spin","slot","card","dice","raffle","giveaway"],"markdown_url":"https://ilham.dev/tools/random-generator/index.md","name":"Random Generator","url":"https://ilham.dev/tools/random-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/discount-calculator/","category":"math","category_name":"Math","description":"Work out a final price, a discount percent, or the original price from a discount and a final price.","examples":["How do I find the discount I was given?","Why does it need a price and a final price for the reverse?","Can the discount be over 100%?","How does the stacked mode work?"],"features":["Runs in the browser","No login required"],"id":"discount-calculator","keywords":["discount","sale","percent","price","original","reverse","diskon","potongan","harga","calculator"],"markdown_url":"https://ilham.dev/tools/discount-calculator/index.md","name":"Discount Calculator","url":"https://ilham.dev/tools/discount-calculator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/unit-price-comparator/","category":"math","category_name":"Math","description":"Compare products by unit price so different pack sizes can be ranked on the same scale.","examples":["Why does it group by unit?","What units are recognised?","Is the cheapest always the best buy?"],"features":["Runs in the browser","No login required"],"id":"unit-price-comparator","keywords":["unit price","compare","value","per litre","per kilo","harga satuan","product","pack size","cheapest"],"markdown_url":"https://ilham.dev/tools/unit-price-comparator/index.md","name":"Unit Price Comparator","url":"https://ilham.dev/tools/unit-price-comparator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/age-calculator/","category":"math","category_name":"Math","description":"Work out an age in years, months and days, with totals and the next birthday.","examples":["Why not just divide the total days by 365?","Which date is the second field for?","How is the next birthday counted?"],"features":["Runs in the browser","No login required"],"id":"age-calculator","keywords":["age","birthday","birth date","umur","tanggal lahir","years","months","days","calculator"],"markdown_url":"https://ilham.dev/tools/age-calculator/index.md","name":"Age Calculator","url":"https://ilham.dev/tools/age-calculator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/sql-insert-generator/","category":"data","category_name":"Data","description":"Turn JSON or CSV rows into SQL INSERT statements for MySQL, PostgreSQL, SQLite or SQL Server.","examples":["How are objects and arrays stored?"],"features":["Runs in the browser","No login required"],"id":"sql-insert-generator","keywords":["sql","insert","json","csv","mysql","postgres","sqlite","database","query","generator"],"markdown_url":"https://ilham.dev/tools/sql-insert-generator/index.md","name":"SQL Insert Generator","url":"https://ilham.dev/tools/sql-insert-generator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/email-normalizer/","category":"data","category_name":"Data","description":"Normalize email addresses to a canonical form.","examples":["Is removing dots always safe?"],"features":["Runs in the browser","No login required"],"id":"email-normalizer","keywords":["email","normalize","canonical","address"],"markdown_url":"https://ilham.dev/tools/email-normalizer/index.md","name":"Email Normalizer","url":"https://ilham.dev/tools/email-normalizer/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/phone-parser/","category":"data","category_name":"Data","description":"Parse and format phone numbers by country.","examples":["Why does a number I know is real show as invalid?"],"features":["Runs in the browser","No login required"],"id":"phone-parser","keywords":["phone","number","format","country","parse"],"markdown_url":"https://ilham.dev/tools/phone-parser/index.md","name":"Phone Parser","url":"https://ilham.dev/tools/phone-parser/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/iban-validator/","category":"data","category_name":"Data","description":"Validate an IBAN and read its country and check digits.","examples":["Does a valid IBAN mean the account exists?"],"features":["Runs in the browser","No login required"],"id":"iban-validator","keywords":["iban","validate","bank","account"],"markdown_url":"https://ilham.dev/tools/iban-validator/index.md","name":"IBAN Validator","url":"https://ilham.dev/tools/iban-validator/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/nik-parser/","category":"data","category_name":"Data","description":"Parse Indonesian NIK into region codes, birth date, gender and serial number.","examples":["Can this validate that a NIK is real?","Why does a female birth date look larger than 31?"],"features":["Runs in the browser","No login required"],"id":"nik-parser","keywords":["nik","ktp","nomor induk kependudukan","parse nik indonesia","indonesian identity number","indonesia identity card","tanggal lahir nik","kode wilayah indonesia","kode provinsi","kode kabupaten","administrative region indonesia"],"markdown_url":"https://ilham.dev/tools/nik-parser/index.md","name":"NIK Parser","url":"https://ilham.dev/tools/nik-parser/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/json-schema-validator/","category":"data","category_name":"Data","description":"Validate a JSON document against a JSON Schema (draft-07 subset) and list every problem with its JSON Pointer path.","examples":["How do I validate a JSON document against a draft-07 schema?","Where exactly did my JSON fail validation?"],"features":["Runs in the browser","No login required"],"id":"json-schema-validator","keywords":["json","schema","validate","draft-07","jsonschema","pointer","api","contract"],"markdown_url":"https://ilham.dev/tools/json-schema-validator/index.md","name":"JSON Schema Validator","url":"https://ilham.dev/tools/json-schema-validator/","use_cases":["validate JSON against a schema","find the path of a schema error"]},{"canonical_url":"https://ilham.dev/tools/json-path-explorer/","category":"data","category_name":"Data","description":"Evaluate JSONPath expressions against JSON, list every match with its path, and build expressions by clicking a tree.","examples":["How do I get every author from this JSON?","How do I filter JSONPath results by value?"],"features":["Runs in the browser","No login required"],"id":"json-path-explorer","keywords":["json","jsonpath","query","explore","filter","tree","pointer","api","extract"],"markdown_url":"https://ilham.dev/tools/json-path-explorer/index.md","name":"JSON Path Explorer","url":"https://ilham.dev/tools/json-path-explorer/","use_cases":["query JSON with JSONPath","explore an API response"]},{"canonical_url":"https://ilham.dev/tools/csv-viewer/","category":"data","category_name":"Data","description":"Open a CSV, TSV or pipe-separated file, filter it and sort it column by column in a table.","examples":["How does it pick the delimiter?","How large a file can it open?","Does it read quoted fields?"],"features":["Runs in the browser","No login required"],"id":"csv-viewer","keywords":["csv","tsv","viewer","table","sort","filter","delimiter","spreadsheet","data"],"markdown_url":"https://ilham.dev/tools/csv-viewer/index.md","name":"CSV Viewer","url":"https://ilham.dev/tools/csv-viewer/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/csv-json-converter/","category":"data","category_name":"Data","description":"Convert CSV to JSON, or JSON back to CSV, with configurable delimiter and pretty-printing.","examples":["What does the JSON have to look like?","Where does the extra header come from?","Are values converted to numbers?"],"features":["Runs in the browser","No login required"],"id":"csv-json-converter","keywords":["csv","json","convert","delimiter","header","objects","rows","data","tsv"],"markdown_url":"https://ilham.dev/tools/csv-json-converter/index.md","name":"CSV and JSON Converter","url":"https://ilham.dev/tools/csv-json-converter/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/typing-speed-test/","category":"games","category_name":"Games","description":"Measure WPM and accuracy with live per-character feedback and a restartable test.","examples":["How is WPM calculated?","What is consistency?","How does accuracy differ from the red characters?","Why does the test not start until I type?"],"features":["Runs in the browser","No login required"],"id":"typing-speed-test","keywords":["typing","speed","wpm","accuracy","test","words per minute","keyboard","practice"],"markdown_url":"https://ilham.dev/tools/typing-speed-test/index.md","name":"Typing Speed Test","url":"https://ilham.dev/tools/typing-speed-test/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/gamepad-tester/","category":"games","category_name":"Games","description":"See every axis and button of a connected controller, with the pressed buttons lit up.","examples":["Why is the controller missing until I press a button?","A stick reports a small value while untouched. Is it broken?","Can it test vibration or the light bar?"],"features":["Runs in the browser","No login required"],"id":"gamepad-tester","keywords":["gamepad","controller","joystick","buttons","axes","test","dead zone","vibration","playstation","xbox"],"markdown_url":"https://ilham.dev/tools/gamepad-tester/index.md","name":"Gamepad Tester","url":"https://ilham.dev/tools/gamepad-tester/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/game-2048/","category":"games","category_name":"Games","description":"Slide and merge numbered tiles to reach 2048, with undo, best score and keyboard or swipe controls.","examples":["How does merging work?","Where is my best score kept?","What does undo do?","Why did the game end when I still had empty squares?","Is there a strategy?"],"features":["Runs in the browser","No login required"],"id":"game-2048","keywords":["2048","game","puzzle","tiles","merge","slide","numbers"],"markdown_url":"https://ilham.dev/tools/game-2048/index.md","name":"2048","url":"https://ilham.dev/tools/game-2048/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/memory-match/","category":"games","category_name":"Games","description":"Flip cards and find matching pairs, with move count, timer and difficulty levels.","examples":["What do the difficulty levels change?","When does the timer start?","Why did my two cards turn back over?","Does a new game reshuffle the same symbols?","Is the board different every time?"],"features":["Runs in the browser","No login required"],"id":"memory-match","keywords":["memory","match","pairs","cards","game","concentration"],"markdown_url":"https://ilham.dev/tools/memory-match/index.md","name":"Memory Match","url":"https://ilham.dev/tools/memory-match/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/minesweeper/","category":"games","category_name":"Games","description":"Clear a grid without hitting a mine, with flags, first-click safety and difficulty levels.","examples":["What does first-click safety mean?","How do I flag a mine?","What do the numbers mean?","How do I win?","Is the board solvable without guessing?"],"features":["Runs in the browser","No login required"],"id":"minesweeper","keywords":["minesweeper","game","mines","flags","puzzle","grid"],"markdown_url":"https://ilham.dev/tools/minesweeper/index.md","name":"Minesweeper","url":"https://ilham.dev/tools/minesweeper/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/snake/","category":"games","category_name":"Games","description":"Steer a growing snake to eat food without hitting the walls or yourself.","examples":["When does the snake start moving?","Why can't I reverse direction?","How does the speed work?","Does eating count on the tail cell?","Where is my best score stored?"],"features":["Runs in the browser","No login required"],"id":"snake","keywords":["snake","game","arcade","retro","canvas"],"markdown_url":"https://ilham.dev/tools/snake/index.md","name":"Snake","url":"https://ilham.dev/tools/snake/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/tetris/","category":"games","category_name":"Games","description":"Stack falling tetrominoes and clear lines, with next-piece preview, hold and levels.","examples":["How does the piece randomiser work?","What is the ghost piece?","How is scoring calculated?","What does the hold slot do?","Why is the board made of divs instead of a canvas?"],"features":["Runs in the browser","No login required"],"id":"tetris","keywords":["tetris","game","blocks","tetromino","arcade","puzzle"],"markdown_url":"https://ilham.dev/tools/tetris/index.md","name":"Tetris","url":"https://ilham.dev/tools/tetris/","use_cases":[]},{"canonical_url":"https://ilham.dev/tools/devops-tycoon/","category":"games","category_name":"Games","description":"Manage servers, traffic and incidents as a DevOps engineer — buy capacity, survive outages and keep the service profitable.","examples":["How does the game decide how much money I make?","Why does adding servers not help as much as I expected?","What happens if I ignore an incident?","What do the temporary fixes do?","Is my progress saved?"],"features":["Runs in the browser","No login required"],"id":"devops-tycoon","keywords":["devops","tycoon","server","infrastructure","simulation","incident","sre","game","management"],"markdown_url":"https://ilham.dev/tools/devops-tycoon/index.md","name":"DevOps Tycoon","url":"https://ilham.dev/tools/devops-tycoon/","use_cases":[]}]