๐ค The Problem
You need to format JSON. What do you do?
- Google "JSON formatter"
- Click random site
- Deal with ads and slow loading
- Use tool
- Need something else? Start over...
There had to be a better way.
๐ก The Solution
I built UtilCraft - all your everyday tools in one place.
๐ฏ What's Inside
15+ Essential Tools
- ๐ผ๏ธ Image Resizer - Batch process, instant results
- ๐ JSON Formatter - Validate, format, minify
- ๐ Password Generator - Cryptographically secure
- ๐จ Color Converter - HEX โ RGB โ HSL โ CMYK
- ๐ฑ QR Generator - URL, WiFi, vCard
- โก Base64 Encoder - Text & files
- ๐ URL Encoder - Safe URL formatting
- ๐ UUID Generator - Bulk generation
- ๐ Word Counter - Real-time stats
- ๐งฎ Calculator - Scientific mode
- ๐ Unit Converter - Length, weight, temp
- ๐ Markdown Editor - Live preview
5+ Mini Games
Quick mental breaks without leaving the site:
- 2048, Snake, Tetris, Memory Match, Tic-Tac-Toe
๐ Why It's Different
1. Privacy First
Everything runs in your browser:
// Images never leave your device
const canvas = document.createElement('canvas')
// Process locally, no upload!
Your files = Your device only.
2. Actually Fast
- No ads slowing you down
- Instant processing
- Works offline (PWA ready)
3. Works Everywhere
- ๐ฑ Mobile optimized
- ๐ 7 languages (ko/en/ja/es/zh/pt/fr)
- ๐ Dark mode included
๐ ๏ธ Tech Stack
Built with modern tools for maximum performance:
Next.js 14 (App Router)
TypeScript (type safety)
Tailwind CSS (styling)
Radix UI (components)
Self-hosted on Oracle Cloud
Why Next.js 14?
Performance wins:
- Server Components for static content
- Client Components for interactive tools
- Code splitting per route
- <50KB initial bundle
Result: Lightning fast, even on slow connections.
๐ Some Cool Technical Bits
Dynamic Loading
// Only load what you need
const ImageResize = dynamic(
() => import('@/components/tools/image-resize'),
{ loading: () => <Spinner /> }
)
Multi-Language Support
// Easy internationalization
lib/translations/
โโโ ko.ts // Korean
โโโ en.ts // English
โโโ ja.ts // Japanese
โโโ ... // and more
Client-Side Processing
// Password generation (secure!)
const generatePassword = (length: number) => {
const array = new Uint8Array(length)
crypto.getRandomValues(array) // Browser crypto API
return convertToPassword(array)
}
๐ช Challenges & Solutions
Challenge 1: Performance
Problem: Tools loading slowly
Solution: Code splitting + dynamic imports
Result: Each tool loads independently
Challenge 2: Mobile UX
Problem: Complex tools on small screens
Solution: Mobile-first design from day 1
Result: Works great on phones
Challenge 3: Offline Usage
Problem: Need internet for every tool
Solution: PWA + client-side processing
Result: Works without connection
๐ What I Learned
Next.js 14 is production-ready
- App Router is stable
- Server/Client split is powerful
- File-based routing scales well
Performance matters more than features
- Fast > Feature-rich
- 1s load time = Happy users
- Bundle size affects everything
Privacy is a feature
- Users appreciate no uploads
- Client-side = zero server costs
- Simpler infrastructure
๐ What's Next
Continuously improving based on user feedback. Have ideas for new tools or features? Let me know!
๐ Try It Yourself
Live site: utilcraft.com
It's completely free, no signup required.
๐ฌ Your Feedback
What would make this more useful for you?
- Missing a tool you use often?
- Found a bug?
- Feature suggestion?
Drop a comment! I'm actively developing this and would love your input.
Built with โค๏ธ by a solo developer who got tired of switching between websites.
#webdev #nextjs #typescript #sideproject
Top comments (0)