5 New Tools, Favorites, and Toast Notifications
This guide has a free tool → Open Emoji Picker
# 5 New Tools, Favorites, and Toast Notifications
Another big update. We have added 5 new tools, a favorites system, and toast notifications to make the experience smoother and more personal. This post covers each new tool in depth - the Emoji Picker, SVG Optimizer, Crontab Generator, Tailwind to CSS Converter, and Placeholder Image Generator - along with the UX improvements that shipped alongside them.
New Tool: Emoji Picker
Browse and search through hundreds of emojis organized by category. Click to copy any emoji to your clipboard instantly.
The Practical Case for an Emoji Picker
Emojis are part of the modern developer workflow in ways that would have seemed strange a decade ago. They appear in:
- Git commit messages to communicate intent at a glance (following conventions like Gitmoji)
- README files and documentation on GitHub
- Slack and Discord messages to teammates
- Pull request titles and descriptions
- Issue tracker labels and comments
- CLI output to signal status - a checkmark for success, a warning sign for alerts
The problem with the OS-native emoji picker is that it is slow to invoke, hard to search, and varies significantly across operating systems. The ToolBox Emoji Picker gives you a consistent, fast, searchable interface in your browser.
Emoji in Git Commits - the Gitmoji Convention
Gitmoji is a widely-adopted convention for using emojis as visual prefixes in commit messages. The idea is that glancing at a commit log should immediately communicate the type of change made, without reading the full message.
Common Gitmoji conventions:
| Emoji | Code | Meaning |
|---|---|---|
| ✨ | :sparkles: | Introduce new feature |
| 🐛 | :bug: | Fix a bug |
| 🔥 | :fire: | Remove code or files |
| 📝 | :memo: | Add or update documentation |
| 🎨 | :art: | Improve structure or format of code |
| ⚡️ | :zap: | Improve performance |
| 🔒 | :lock: | Fix security issues |
| ♻️ | :recycle: | Refactor code |
| 🧪 | :test_tube: | Add failing test |
| 🚀 | :rocket: | Deploy stuff |
| 💄 | :lipstick: | Update UI and style files |
| 🔧 | :wrench: | Add or update configuration files |
| 📦 | :package: | Add or update compiled files or packages |
| ⬆️ | :arrow_up: | Upgrade dependencies |
| ⬇️ | :arrow_down: | Downgrade dependencies |
Example commit history with Gitmoji:
✨ Add dark mode support with system preference detection
🐛 Fix JWT decoder failing on tokens with padding characters
📝 Update README with installation instructions
⚡️ Defer non-critical JavaScript for faster initial load
🔒 Sanitize user input in search to prevent XSS
♻️ Extract color conversion logic into shared utility moduleA log like this communicates intent in two columns - the emoji tells you the type of change, the message tells you what changed. You can scan dozens of commits in seconds.
Emoji in Code - When It Is Appropriate
Beyond communication and documentation, emojis appear in production code in specific contexts:
Status indicators in CLI tools:
// Node.js CLI output
console.log('Building project...');
// output: Building project...
// With emoji
console.log('\u2705 Build complete'); // ✅ Build complete
console.log('\u274C Build failed'); // ❌ Build failed
console.log('\u26A0\uFE0F Warning: slow operation detected'); // ⚠️ WarningPython logging with emoji:
import logging
logging.basicConfig(format='%(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info('🚀 Server starting on port 3000')
logger.warning('⚠️ Rate limit threshold approaching')
logger.error('❌ Database connection failed')Emoji in environment variable values:
Avoid emojis in environment variable names or values. Some shells and dotenv parsers do not handle multi-byte Unicode correctly, leading to subtle bugs.
Emoji Encoding - What Developers Should Know
Each emoji is a Unicode code point (or sequence of code points). Understanding the encoding prevents bugs.
Single code point emojis:
'⭐'.length // 1 in some contexts, 2 in JavaScript (UTF-16 surrogate pair)JavaScript's UTF-16 encoding issue:
const heart = '❤️';
console.log(heart.length); // 2 - JavaScript counts UTF-16 code units
// Use Array.from() to count actual characters
console.log(Array.from(heart).length); // 1 (in this case)Compound emojis using Zero Width Joiner (ZWJ):
Some emojis are composed of multiple code points joined by ZWJ (U+200D):
👨💻 = 👨 + ZWJ + 💻
👩🦰 = 👩 + ZWJ + 🦰
🏳️🌈 = 🏳️ + ZWJ + 🌈This means the string length in JavaScript for these emojis can be 4 or more code units even though you see one character on screen. Use the `Intl.Segmenter` API for accurate character counting when user-facing text might contain emojis.
const segmenter = new Intl.Segmenter();
const segments = [...segmenter.segment('Hello 👨💻')];
console.log(segments.length); // 7 (5 letters + space + 1 emoji)Emoji Picker
Free online emoji picker - search, browse, and copy emojis to your clipboard instantly
SVG Optimizer
Free online SVG optimizer - paste SVG code and get a minified, optimized version instantly
Crontab Generator
Free online crontab generator - build cron expressions visually with an intuitive interface
New Tool: SVG Optimizer
Paste SVG code and get an optimized, minified version. Removes metadata, comments, editor attributes, and unnecessary whitespace while preserving visual fidelity.
Why SVG Files Need Optimization
SVG files exported from design tools like Figma, Illustrator, or Inkscape contain a significant amount of metadata that is not needed in production. This includes:
<!--?xml version="1.0"?>declarations<!-- Generator: Adobe Illustrator 26.0... -->commentsidandclassattributes from the design tool's internal naming- Editor-specific namespaces (
xmlns:xlink,xmlns:dc,xmlns:cc) - Redundant
styleattributes that duplicate presentation attributes - Invisible whitespace characters and unnecessary decimal precision
Example: A simple icon exported from Figma
Before optimization (2,847 bytes):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1" id="Layer_1" x="0px" y="0px" width="24px" height="24px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;"
xml:space="preserve">
<!-- Generator: Adobe Illustrator 26.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<g id="Icons" style="opacity:1;">
<g id="icon_x5F_check" transform="translate(0, 0)">
<path id="checkmark" style="fill:#000000;fill-opacity:1;stroke:none;"
d="M9.000,18.000 C8.744,18.000 8.488,17.902 8.293,17.707 L3.293,12.707 C2.902,12.316 2.902,11.684 3.293,11.293 C3.684,10.902 4.316,10.902 4.707,11.293 L9.000,15.586 L19.293,5.293 C19.684,4.902 20.316,4.902 20.707,5.293 C21.098,5.684 21.098,6.316 20.707,6.707 L9.707,17.707 C9.512,17.902 9.256,18.000 9.000,18.000 Z"/>
</g>
</g>
</svg>After optimization (312 bytes):
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<path d="M9 18a1 1 0 0 1-.707-.293l-5-5a1 1 0 0 1 1.414-1.414L9 15.586 19.293 5.293a1 1 0 0 1 1.414 1.414l-11 11A1 1 0 0 1 9 18Z"/>
</svg>That is an 89% reduction in file size for identical visual output. When you have a site with dozens of inline SVG icons, this adds up to meaningful bandwidth savings.
What Gets Removed and Why It Is Safe
XML declarations (<?xml version="1.0"?>)
Only needed if the SVG is a standalone file consumed as XML. In an HTML page, the browser already knows it is parsing XML within the SVG element.
DOCTYPE declarations
Not used by modern browsers. Removed safely.
Generator comments
Design tool metadata comments serve no purpose in production. Removed safely.
Unused namespace declarations
xmlns:xlink is legacy from SVG 1.1. Modern SVGs use plain href instead of xlink:href. If the SVG does not use xlink attributes, the namespace declaration is safe to remove.
Redundant attributes
x="0" y="0"on<svg>- this is the defaultversion="1.1"- ignored by browsersstyle="enable-background:new 0 0 24 24;"- an Illustrator-specific attribute that browsers ignore
Precision reduction
A path like d="M9.000,18.000" is equivalent to d="M9 18". Reducing decimal places saves bytes with zero visual difference.
SVG in Production - Best Practices
Inline SVG vs external files:
| Method | Pros | Cons |
|---|---|---|
| Inline in HTML | Can be styled with CSS, no extra HTTP request | Increases HTML size, not cached separately |
External <img src="icon.svg"> | Cached by browser, reusable | Cannot style internals with CSS |
| CSS background-image: url() | Cached, works in pseudo-elements | Cannot style internals with CSS |
<use xlink:href="#sprite"> | Reusable from a sprite sheet | Older pattern, xlink deprecated |
For icons that need to change color based on theme (dark/light mode), inline SVG is usually the right choice:
<button class="theme-toggle">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24">
<path fill="currentColor" d="M12 3a9 9 0 1 0 9 9c0-.46-.04-.92-.1-1.36a5.39 5.39 0 0 1-4.4 2.26 5.33 5.33 0 0 1-5.33-5.33c0-1.79.88-3.37 2.23-4.37C12.87 3.04 12.44 3 12 3Z"/>
</svg>
</button>.theme-toggle svg {
color: var(--text-color); /* currentColor inherits this */
}The currentColor keyword in SVG inherits the CSS color property of the element. This lets you control SVG fill and stroke colors with CSS without touching the SVG markup.
SVGO - the Engine Behind Optimization
The SVG Optimizer uses a configuration of SVGO (SVG Optimizer) rules. SVGO is the industry-standard Node.js library for SVG optimization, used by build tools like Webpack, Vite, and Create React App.
Understanding the optimization pipeline helps you know when to apply which rules:
import { optimize } from 'svgo';
const result = optimize(svgString, {
plugins: [
'removeDoctype',
'removeXMLProcInst',
'removeComments',
'removeMetadata',
'removeEditorsNSData',
'cleanupIds',
'removeUselessDefs',
'cleanupNumericValues',
'convertColors',
'removeUnknownsAndDefaults',
'removeNonInheritableGroupAttrs',
'removeUselessStrokeAndFill',
'cleanupEnableBackground',
'convertShapeToPath',
'convertEllipseToCircle',
'mergePaths',
'convertTransform',
'removeEmptyAttrs',
'removeEmptyContainers',
'removeUnusedNS',
'minifyStyles',
'sortAttrs',
'collapseGroups',
'removeRasterImages',
]
});New Tool: Crontab Generator
The visual companion to our Cron Parser. Build cron expressions using dropdowns and toggles instead of memorizing syntax. See real-time previews of your schedule.
From Expression to Visual Builder
The Cron Parser goes from expression to explanation. The Crontab Generator goes the other direction - from visual configuration to expression.
Instead of writing 0 9 * * 1-5, you:
- Set "minute" to 0
- Set "hour" to 9
- Leave "day of month" as every day
- Leave "month" as every month
- Set "day of week" to Monday through Friday
The tool generates 0 9 * * 1-5 and shows you "At 09:00 AM, Monday through Friday" in real time.
The Mental Model for Building Cron Expressions
Cron expressions are read from smallest to largest time unit, then constrained by day filters. The logic is:
- At what minute(s) of the hour should this run?
- At what hour(s) of the day?
- On what day(s) of the month?
- In what month(s)?
- On what day(s) of the week?
Day-of-month and day-of-week interact with OR logic, not AND. If you specify a day-of-month and a day-of-week, the job runs on days that match EITHER condition (in most cron implementations). This surprises many developers.
# This does NOT mean "first Monday of the month"
# It means "every Monday OR the 1st of every month"
0 9 1 * 1To schedule for the first Monday of the month, you need application-level logic or a more sophisticated scheduler.
Cron in Different Environments
Standard Unix crontab fields (5 fields):
MIN HOUR DOM MON DOWQuartz Scheduler (Java - 6 or 7 fields):
SEC MIN HOUR DOM MON DOW [YEAR]AWS EventBridge cron (6 fields, different syntax):
MIN HOUR DOM MON DOW YEARAWS uses ? instead of * to indicate "no specific value" for day fields, and day-of-week uses 1-7 instead of 0-6.
GitHub Actions (standard 5 fields, UTC timezone):
on:
schedule:
- cron: '0 9 * * 1-5'GitHub Actions cron runs always run in UTC. This is non-negotiable. If you need a job at 9 AM US Eastern, that is 0 14 * * 1-5 (UTC) or 0 13 * * 1-5 during daylight saving time.
New Tool: Tailwind to CSS Converter
Paste Tailwind utility classes and see the equivalent vanilla CSS properties.
Why This Tool Exists
Tailwind CSS has become the dominant utility-first CSS framework, but working with it involves a mental translation layer. When you write flex items-center justify-between gap-4 p-6 rounded-xl shadow-lg, you are writing CSS - just in a compressed, abbreviated form.
The Tailwind to CSS Converter performs that translation explicitly, showing you the underlying CSS properties. This is useful for:
- Learning Tailwind by seeing the CSS it generates
- Migrating away from Tailwind to vanilla CSS or another framework
- Understanding why a layout is behaving a certain way by seeing the actual CSS rules
- Debugging - sometimes seeing the raw CSS properties reveals a conflict that is invisible in utility class form
- Documenting component styles for team members who are not familiar with Tailwind
Tailwind Class to CSS Mapping - Reference Table
Layout:
| Tailwind class | CSS property |
|---|---|
block | display: block |
inline-block | display: inline-block |
flex | display: flex |
inline-flex | display: inline-flex |
grid | display: grid |
hidden | display: none |
relative | position: relative |
absolute | position: absolute |
fixed | position: fixed |
sticky | position: sticky |
overflow-hidden | overflow: hidden |
overflow-auto | overflow: auto |
Flexbox:
| Tailwind class | CSS property |
|---|---|
flex-row | flex-direction: row |
flex-col | flex-direction: column |
items-start | align-items: flex-start |
items-center | align-items: center |
items-end | align-items: flex-end |
justify-start | justify-content: flex-start |
justify-center | justify-content: center |
justify-end | justify-content: flex-end |
justify-between | justify-content: space-between |
justify-around | justify-content: space-around |
flex-wrap | flex-wrap: wrap |
flex-nowrap | flex-wrap: nowrap |
flex-1 | flex: 1 1 0% |
flex-auto | flex: 1 1 auto |
flex-none | flex: none |
grow | flex-grow: 1 |
shrink | flex-shrink: 1 |
Spacing (Tailwind default: 1 unit = 4px):
| Tailwind class | CSS property |
|---|---|
p-0 | padding: 0 |
p-1 | padding: 0.25rem (4px) |
p-2 | padding: 0.5rem (8px) |
p-4 | padding: 1rem (16px) |
p-6 | padding: 1.5rem (24px) |
p-8 | padding: 2rem (32px) |
px-4 | padding-left: 1rem; padding-right: 1rem |
py-2 | padding-top: 0.5rem; padding-bottom: 0.5rem |
m-4 | margin: 1rem |
mx-auto | margin-left: auto; margin-right: auto |
mt-4 | margin-top: 1rem |
gap-4 | gap: 1rem |
Typography:
| Tailwind class | CSS property |
|---|---|
text-sm | font-size: 0.875rem; line-height: 1.25rem |
text-base | font-size: 1rem; line-height: 1.5rem |
text-lg | font-size: 1.125rem; line-height: 1.75rem |
text-xl | font-size: 1.25rem; line-height: 1.75rem |
text-2xl | font-size: 1.5rem; line-height: 2rem |
font-normal | font-weight: 400 |
font-medium | font-weight: 500 |
font-semibold | font-weight: 600 |
font-bold | font-weight: 700 |
text-center | text-align: center |
uppercase | text-transform: uppercase |
tracking-wide | letter-spacing: 0.025em |
leading-tight | line-height: 1.25 |
leading-relaxed | line-height: 1.625 |
truncate | overflow: hidden; text-overflow: ellipsis; white-space: nowrap |
Borders and Radius:
| Tailwind class | CSS property |
|---|---|
rounded | border-radius: 0.25rem |
rounded-md | border-radius: 0.375rem |
rounded-lg | border-radius: 0.5rem |
rounded-xl | border-radius: 0.75rem |
rounded-2xl | border-radius: 1rem |
rounded-full | border-radius: 9999px |
border | border-width: 1px |
border-2 | border-width: 2px |
border-solid | border-style: solid |
Effects:
| Tailwind class | CSS property |
|---|---|
shadow | box-shadow: 0 1px 3px 0 rgb(0 0 0/.1), 0 1px 2px -1px rgb(0 0 0/.1) |
shadow-md | box-shadow: 0 4px 6px -1px rgb(0 0 0/.1), 0 2px 4px -2px rgb(0 0 0/.1) |
shadow-lg | box-shadow: 0 10px 15px -3px rgb(0 0 0/.1), 0 4px 6px -4px rgb(0 0 0/.1) |
opacity-50 | opacity: 0.5 |
cursor-pointer | cursor: pointer |
Migrating from Tailwind to CSS
If you are removing Tailwind from a project, the converter is a practical migration tool. Process each component class string through the converter and you get ready-to-paste CSS.
<!-- Tailwind version -->
<div class="flex items-center gap-3 px-4 py-2 rounded-lg bg-blue-600 text-white font-medium hover:bg-blue-700 transition-colors">
Save Changes
</div>After conversion, write this CSS:
.save-button {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.5rem 1rem;
border-radius: 0.5rem;
background-color: #2563eb; /* blue-600 */
color: #ffffff;
font-weight: 500;
transition-property: color, background-color, border-color;
transition-duration: 150ms;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}
.save-button:hover {
background-color: #1d4ed8; /* blue-700 */
}New Tool: Placeholder Image Generator
Generate customizable placeholder images with custom dimensions, colors, and text. Download as PNG or copy as data URI.
Use Cases for Placeholder Images
Placeholder images solve a specific problem in development: you need something visually representative in the layout before real content is available. They are used in:
- Wireframes and mockups - showing image positions before photography or design is finalized
- Automated testing - providing consistent images for visual regression tests
- Documentation - illustrating image component usage in a styleguide
- Demo applications - building demos without needing real image assets
- Load testing - generating many different-sized images for performance tests
The Placeholder Image Generator creates these on demand in your browser, no server call required.
Placeholder Images in HTML
The most common use of placeholder images in development:
<!-- Simple gray placeholder -->
<img src="https://placeholder.com/400x300" alt="Placeholder" width="400" height="300">
<!-- With custom dimensions and text -->
<img src="https://via.placeholder.com/400x300/3B82F6/FFFFFF?text=Product+Image"
alt="Product placeholder" width="400" height="300">With the ToolBox generator, you can download the image as a PNG and reference it locally, or use the data URI to embed it directly:
<!-- Data URI - the image is embedded directly, no external request -->
<img src="data:image/png;base64,iVBORw0KGgo..." alt="Placeholder">/* As a CSS background */
.product-image {
background-image: url('data:image/png;base64,iVBORw0KGgo...');
background-size: cover;
width: 400px;
height: 300px;
}Standard Placeholder Sizes Reference
| Use case | Width x Height | Aspect ratio |
|---|---|---|
| Blog post hero image | 1200 x 628 | ~1.91:1 |
| Open Graph image | 1200 x 630 | ~1.91:1 |
| Twitter card (large) | 1200 x 628 | ~1.91:1 |
| YouTube thumbnail | 1280 x 720 | 16:9 |
| Profile photo | 400 x 400 | 1:1 |
| Product listing | 800 x 800 | 1:1 |
| Full-width banner | 1920 x 600 | ~3.2:1 |
| Blog thumbnail | 600 x 400 | 3:2 |
| Mobile hero | 390 x 844 | ~1:2.16 |
| E-commerce grid | 600 x 750 | 4:5 |
Favorites System
You can now favorite tools by clicking the heart icon on any tool card. Your favorites are saved in your browser's local storage and appear in a dedicated section at the top of the homepage for quick access.
How Local Storage Favorites Work
The favorites system uses the browser's localStorage API. When you click the heart on a tool card, the tool's slug is added to (or removed from) a JSON array stored in your browser:
// Read favorites
const getFavorites = () => {
const stored = localStorage.getItem('toolbox_favorites');
return stored ? JSON.parse(stored) : [];
};
// Toggle a favorite
const toggleFavorite = (slug) => {
const favorites = getFavorites();
const index = favorites.indexOf(slug);
if (index === -1) {
favorites.push(slug);
} else {
favorites.splice(index, 1);
}
localStorage.setItem('toolbox_favorites', JSON.stringify(favorites));
};
// Check if a tool is favorited
const isFavorited = (slug) => getFavorites().includes(slug);What this means for you:
- Favorites persist across browser sessions and page refreshes
- They are tied to the browser - favorites on your desktop do not sync to your phone
- Clearing browser data (cookies, localStorage) will reset your favorites
- You can favorite as many tools as you like
Organizing Your Workflow with Favorites
The most effective way to use the favorites system is to identify the tools you reach for every working day and favorite those first. Common favorites for developers:
- JSON Formatter - used multiple times per day when working with APIs
- Diff Checker - essential for code review and comparing config versions
- JWT Decoder - valuable whenever you are debugging authentication
- Regex Tester - needed whenever you write a new validation pattern
- Base64 - used frequently in credential encoding and data URIs
- Timestamp Converter - used whenever reading Unix timestamps in logs
For designers:
- Color Converter - switching between design and code color formats
- Color Palette Generator - exploring color schemes
- SVG Optimizer - cleaning up exports before handing off to developers
- Placeholder Image Generator - generating mockup assets
Toast Notifications
Every copy-to-clipboard action now shows a toast notification confirming the copy was successful. No more wondering if it worked.
Why Clipboard Feedback Matters
The Clipboard API is asynchronous in modern browsers and can fail silently in certain contexts. Before toast notifications, a click on "Copy" might succeed or fail with no visible feedback either way. Users would paste into another application hoping it worked.
The navigator.clipboard.writeText() API returns a promise:
const copyToClipboard = async (text) => {
try {
await navigator.clipboard.writeText(text);
showToast('Copied to clipboard!');
} catch (err) {
// Clipboard API might fail if:
// - Page is not focused
// - User denied clipboard permission
// - Browser does not support the API (fallback to document.execCommand)
showToast('Copy failed - try selecting and copying manually', 'error');
}
};The toast notification closes the feedback loop. You see "Copied!" - you know it worked.
Toast Notification Design Principles
Good toast notifications follow these rules:
Appear near the action, not in a fixed corner away from context. If the notification is far from where you clicked, you have to look away from what you are doing to confirm the result.
Auto-dismiss after a short delay. Toasts are ephemeral confirmations, not persistent alerts. 2-3 seconds is the standard duration for success messages.
Do not stack excessively. If a user clicks "Copy" five times rapidly, displaying five stacked toasts is disorienting. Queue or replace toasts rather than stacking infinitely.
Use distinct colors for severity levels:
- Green or neutral: success (copy confirmation, save complete)
- Yellow: warning (action completed with caveats)
- Red: error (action failed, needs user attention)
Do not use toasts for critical errors. If an action fails in a way that requires user intervention, use an inline error message or modal dialog - not a toast that will disappear in 3 seconds.
Animations and Polish
We have added smooth animations throughout the site - fade-in effects for content, hover transitions on cards, and a floating animation on the hero section.
CSS Animations Used
Fade-in on scroll:
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.animate-fade-in {
animation: fadeInUp 0.4s ease-out forwards;
}Card hover transition:
.tool-card {
transition: transform 150ms ease, box-shadow 150ms ease;
}
.tool-card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px -4px rgba(0, 0, 0, 0.15);
}Hero floating animation:
@keyframes float {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-8px); }
}
.hero-graphic {
animation: float 3s ease-in-out infinite;
}All animations respect prefers-reduced-motion:
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}Try the New Tools
All five new tools are live at toolbox-kit.com:
- Emoji Picker - find and copy any emoji instantly
- SVG Optimizer - clean and compress SVG files
- Crontab Generator - build cron expressions visually
- Tailwind to CSS Converter - see the CSS behind Tailwind classes
- Placeholder Image Generator - generate placeholder images on demand
Click the heart icon on any tool card to add it to your favorites and build your personal toolkit at the top of the homepage.
You might also like
Want higher limits, batch processing, and AI tools?