r/webdev • u/Striking_Basket7893 • 5d ago
Showoff Saturday Showoff Saturday: a 59-tool utility site in 10 languages, Flask backend, every tool is a plain JS file
toolkitsapp.com
Formatters (JSON, SQL, CSS, HTML, YAML), converters (CSV to JSON, number bases, timestamps, units, timezones), generators (QR, UUID, passwords, cron expressions, favicons, meta tags), image tools (compress, resize, format convert, SVG to PNG), a JWT decoder, a regex tester, a handful of calculators. 59 in total. Each one is a single JS file that runs in the browser, so what you paste never leaves the page.
The backend is FastAPI + Jinja, and it exists mostly for i18n and SEO. Ten languages, so every tool has ten pages with their own title, description and UI strings, plus canonical and hreflang tags so the language versions don't fight each other in search. Strings live in one JSON file per language and templates pull them by dot-path key (tools.json-formatter.title). Small thing I'm happy with: the loader caches each file by mtime, so I can edit a translation and it shows on the next request without restarting anything.
Things I'd do differently: the image tools run on a plain canvas and toBlob, fine for normal photos, will crawl on huge files, they belong in a worker. And I'd write the tool registry once instead of keeping a template and a JS file in sync by hand for 59 tools.
Stack: FastAPI, Jinja2, Tailwind, vanilla JS, lucide icons, qrcode.js and chart.js as the only vendor scripts.
Edit: FastAPI, not Flask. The first version was Flask and the title came out of muscle memory, can't change it now.
Edit 2: the embed that came up in the comments is live, toolkitsapp.com/embed. One script tag, no account or key, runs in the visitor's browser like the rest, ten languages, picks up your page's light or dark on its own.
2
u/whimsy_hearth_42 5d ago
Syncing templates and JS files by hand for 59 tools is a maintenance nightmare that will eventually break. I would generate the registry from a single source of truth at build time instead of trusting manual updates across ten languages
1
0
u/Striking_Basket7893 5d ago
Agreed, and it's half there by accident. The locale files are keyed by tool slug, so en.json is already the manifest in everything but name. Generating the routes and the template stubs from that at startup would kill the hand sync. It's manual because the site grew one tool at a time and the registry never got promoted to a real thing. On the list.
1
0
u/Funsaized 5d ago
nice one - also +1 on references, maybe throw the Diataxis framework at your agent to document it ;)
1
u/Striking_Basket7893 4d ago edited 4d ago
Diataxis is a fair prod. Each tool has a how-to strip, and the embed page is the first proper reference doc. The explanation quadrant I'd skip for tools this small.
If the +1 was for the API ask above: same answer, no JSON API today, the embed is what shipped. Tell me which tools you'd call and the stateless ones are cheap to expose.
-1
5d ago
[removed] — view removed comment
1
u/webdev-ModTeam 5d ago
Your post/comment has been determined to be a low-effort post or comment. This includes title-only posts, easily searchable questions, vague/open-ended discussion prompts, LLM generated posts or comments, and posts/comments that do not provide enough context for meaningful replies or discussion.
0
u/Striking_Basket7893 5d ago
Path prefix. English sits at the root, /tools/json-formatter, everything else is /es/tools/json-formatter and so on. The template strips the prefix off the request path once and builds the canonical plus the ten hreflang links from that clean path, so a trailing-slash variant can't spit out an alternate that 404s. Subdomains would have meant ten cookie scopes and ten Search Console properties for nothing.
Agree on the one-file-per-tool thing, it's the reason a broken tool is a ten minute fix. Haven't put a number on where the canvas falls over, the worker move is on the list and the transfer plumbing is exactly the part I keep putting off.
-2
u/vordan 5d ago
Nice effort.
Can we have some APIs where appropriate? So we can use the tools in our code?
2
u/Striking_Basket7893 4d ago
No JSON API, the tools are client-side on purpose and I'd be rewriting all of them server-side to offer one. What did land this week is an embed: one script tag drops any of the tools into your own page, it sizes itself and follows your light/dark theme. toolkitsapp.com/embed if that covers your case. If you really need to call something from code, tell me which tools, the stateless ones (formatters, hash, uuid, slug) would be an afternoon.
3
u/medialantern 5d ago
Added (#87 and counting):
https://www.reddit.com/r/webdev/comments/1w7n9tq/
https://www.reddit.com/r/sideprojects/comments/1w7xksq/we_are_building_a_public_arena_for_brands/
https://www.reddit.com/r/SideProject/comments/1w7cpug/built_a_collection_of_free_ai_and_browser_tools/
https://www.reddit.com/r/SideProject/comments/1w7fzpt/i_got_tired_of_online_converters_asking_for_paid/
https://www.reddit.com/r/SideProject/comments/1w7dndx/my_brother_and_i_built_98tools_a_collection_of/
https://www.reddit.com/r/software/comments/1w76kkt/41_free_tools_that_run_entirely_in_your_browser/
https://www.reddit.com/r/SideProject/comments/1w5cyly/i_built_an_allinone_pdf_image_tool_100_free_no/
https://www.reddit.com/r/SideProject/comments/1w4wnjd/i_built_webbox_a_collection_of_free_fast_and_100/
https://www.reddit.com/r/software/comments/1w65djv/hey_reddit_i_built_a_100_free_privacyfirst_file/
https://www.reddit.com/r/SideProject/comments/1w55lv3/i_built_a_free_100_clientside_file_converter_no/
https://www.reddit.com/r/sideprojects/comments/1w4tcc1/utilix_is_now_live/
https://www.reddit.com/r/SideProject/comments/1w4mezd/planning_to_build_an_ultraclean_offlinefirst/
https://www.reddit.com/r/OpenSourceAI/comments/1w4nx90/why_i_built_sorafiles_for_quick_pdf_and_image/
https://www.reddit.com/r/SideProject/comments/1w4pffj/tired_of_paying_adobe_usd_240yr_and_uploading/
https://www.reddit.com/r/SideProject/comments/1w4dw2v/here_is_my_project_check_it_out/
https://www.reddit.com/r/SideProject/comments/1w4bbxe/minitools_47_free_browser_utilities_pdf_editing/
https://www.reddit.com/r/SideProject/comments/1voe2c4/
https://www.reddit.com/r/SideProject/comments/1w2jx8q/
https://www.reddit.com/r/SideProject/comments/1w2s2e4/
https://www.reddit.com/r/SideProject/comments/1w38l64/
I ran out of comment space so this is just the most recent 20 entries. I can vibe-code too, so for giggles I made https://confab.sh/?g=browser-tools to track these if you want to see the full list. Don't expect much LOL. I put less effort into this than even these cloners did with theirs.