small, sharp dev tools — the kind you reach for a dozen times a week and don't want to install, sign up for, or scroll past ads to use.
−cookie modals, ad banners, opaque data collection
−"sign up to use this basic utility"
−uploading your JWT tokens to someone's mystery server
+runs in your browser — no network calls for core tools
+one tap from home, no signup, no dark patterns
+frontend is open source — auditable, self-hostable anywhere
// tech stack
$catstack.txt
# the stackastro· static site generator, zero js by default
css· vanilla, custom-properties for theming
typescript· for catalog types and build-time logic
fonts· fraunces, inter tight, jetbrains mono
icons· tabler icons (open source, mit)
hosting· static, deployable anywhere
analytics· cloudflare web analytics # cookieless, aggregate only# what's not here× react / vue / svelte
× tracking pixels, retargeting, third-party ads
// questions
security & privacy
Q.where exactly is my data processed?+
for all core tools (JSON, JWT, Base64, regex, hashing, etc.) — exclusively in your browser. processing runs via JavaScript and the WebCrypto API on your device. your tokens, API keys, and log payloads physically cannot leave your tab because there is no backend for these operations.
for Pro cloud features (batch jobs, large file processing, REST API) data is transmitted to an isolated server, processed in memory, and immediately discarded — never logged, never stored.
Q.any trackers, ads, or cookies?+
none. no Google Analytics, no Facebook Pixel, no retargeting scripts, no third-party cookies. the only analytics is Cloudflare Web Analytics — cookieless, privacy-first, aggregate only (which pages load, which country). it has zero access to anything you paste into the tools. no cookie banner because there are no cookies to consent to.
Q.can I use whittly offline?+
once a page is loaded, yes — all core tools work without internet. self-hosting is easy: clone the frontend repo and serve the static files however you like. the API is proprietary and runs separately.
pro & pricing
Q.why introduce paid plans if core tools are free?+
core tools are browser-local and cost almost nothing to run. but cloud features — batch processing, large file handling, REST API endpoints — require real server-side compute. paid tiers exist solely to cover those infrastructure costs. not to fund ads, not to build a data profile on you, not to create lock-in. the free tier stays complete and useful forever.
Q.what does pro actually cost?+
Pro is $6/month or $49/year (~2 months free). API is $24/month or $199/year. both are coming soon — join the waitlist on the pricing page. pricing in rubles for RU/CIS is also available.
Q.where is my pro history stored?+
by default, history is stored locally in your browser. if you enable cloud sync in your pro account, it is encrypted and stored on our servers. you can export or delete it at any time.
philosophy
Q.why "whittly"?+
to whittle is to slowly shave a piece of wood with a sharp knife until you get exactly the shape you want — nothing more, nothing less. it felt right for a project about small, sharp tools and about whittling away the noise of most dev-tool sites: the banners, the modals, the mystery servers, the dark patterns. cut until only the useful part remains.
Q.can I contribute a tool?+
please do. the frontend is open source — each tool is one self-contained Astro component. open an issue on GitHub describing what you want to add, or send a pull request directly.
[{"name":"timestamp converter","slug":"timestamp-converter","desc":"unix ↔ date, iso 8601, utc, relative","cat":"convert","icon":"ti-clock-2"},{"name":"csv ↔ json","slug":"csv-json","desc":"convert csv to json and back, auto-detect delimiter","cat":"convert","icon":"ti-table"},{"name":"xml ↔ json","slug":"xml-json","desc":"parse xml into json and back","cat":"convert","icon":"ti-arrows-shuffle"},{"name":"number base converter","slug":"number-base-converter","desc":"decimal, binary, octal, hex and any custom base","cat":"convert","icon":"ti-number"},{"name":"json formatter","slug":"json-formatter","desc":"prettify, minify, validate, tree view","cat":"format","icon":"ti-braces"},{"name":"base64","slug":"base64","desc":"encode and decode, text or file","cat":"encode","icon":"ti-binary"},{"name":"url encoder","slug":"url-encoder","desc":"percent-encode and decode url components","cat":"encode","icon":"ti-link"},{"name":"hash generator","slug":"hash-generator","desc":"sha-1, sha-256, sha-384, sha-512 via web crypto","cat":"encode","icon":"ti-shield-lock"},{"name":"html entity encoder","slug":"html-entity-encoder","desc":"escape and unescape html special characters","cat":"encode","icon":"ti-code"},{"name":"bcrypt","slug":"bcrypt","desc":"hash and verify passwords with bcrypt","cat":"encode","icon":"ti-lock"},{"name":"jwt decoder","slug":"jwt-decoder","desc":"decode tokens, inspect claims","cat":"encode","icon":"ti-key"},{"name":"uuid generator","slug":"uuid-generator","desc":"v4, v7, nanoid, custom","cat":"generate","icon":"ti-fingerprint"},{"name":"password generator","slug":"password-generator","desc":"configurable length, charset, entropy score","cat":"generate","icon":"ti-password"},{"name":"text diff","slug":"text-diff","desc":"line-level diff between two texts","cat":"text","icon":"ti-file-diff"},{"name":"case normalizer","slug":"case-normalizer","desc":"camelCase, snake_case, kebab-case, PascalCase and more","cat":"text","icon":"ti-letter-case"},{"name":"regex tester","slug":"regex-tester","desc":"live match highlighting, explain mode","cat":"text","icon":"ti-regex"},{"name":"slug generator","slug":"slug-generator","desc":"url-safe slugs from any text, supports cyrillic","cat":"text","icon":"ti-slash"},{"name":"string inspector","slug":"string-inspector","desc":"length, bytes, unicode, entropy, character frequency","cat":"text","icon":"ti-text-scan-2"},{"name":"cron parser","slug":"cron-parser","desc":"translate schedules to english","cat":"data","icon":"ti-clock-bolt"},{"name":"curl converter","slug":"curl-converter","desc":"convert curl to fetch, axios, python requests","cat":"data","icon":"ti-terminal"},{"name":"query string parser","slug":"query-string-parser","desc":"parse and build url query strings","cat":"data","icon":"ti-list"},{"name":"mime lookup","slug":"mime-lookup","desc":"find the right mime type for any file extension","cat":"data","icon":"ti-file-type"}]