Skip to content

Repository files navigation

ILoveIMG Studio

ILoveIMG Studio Logo

ILoveIMG Studio

The Ultimate Browser-Based Image Processing Toolkit
46+ Professional Tools · 100% Client-Side · Zero Uploads · Complete Privacy

Codezela TechnologiesLicense: MITVersion

Features · Tools · Installation · Usage · API · Architecture


Table of Contents


Introduction

ILoveIMG Studio is a comprehensive, production-ready image processing application that runs entirely in your browser. Unlike traditional image processing services that upload your files to remote servers, ILoveIMG Studio performs all operations client-side using modern web technologies including WebAssembly, HTML5 Canvas API, and Vue 3.

Key Differentiators

  • True Zero-Upload Architecture: Your images never leave your device
  • 46+ Specialized Tools: Complete coverage for format conversion, compression, resizing, and editing
  • PWA Support: Install as a desktop/mobile app, works offline
  • Privacy-First Design: No tracking, no cookies, no data collection
  • Professional Quality: Production-ready with comprehensive error handling
  • Lightning Fast: GPU-accelerated canvas operations, no network latency

Features

Format Conversion (34 Tools)

Complete bidirectional conversion matrix for 9 image formats:

Core Formats:

  • JPG ↔ PNG ↔ WEBP ↔ GIF
  • PNG ↔ JPG ↔ WEBP ↔ GIF
  • WEBP ↔ JPG ↔ PNG ↔ GIF

Legacy & Specialized:

  • BMP → JPG, PNG (read-only, legacy support)
  • TIFF → JPG, PNG (read-only, print/archival)
  • GIF → JPG, PNG, WEBP (static frame extraction)

Next-Generation:

  • HEIC/HEIF → JPG, PNG (iPhone photo support via libheif-js)
  • AVIF ↔ JPG, PNG, WEBP (modern compression via Squoosh)
  • SVG → PNG (vector to raster)

Icon Generation:

  • PNG/JPG/WEBP → ICO (Windows icon format with multi-resolution support)

Compression (4 Tools)

Quality-adjustable compression for web-optimized images:

  • Compress JPG - Adjustable quality (1-100%), progressive encoding
  • Compress PNG - Lossy compression with quality control
  • Compress WEBP - Superior compression vs JPG/PNG
  • Compress GIF - Color palette optimization

Resize & Crop (2 Tools)

  • Resize Image - Custom dimensions with aspect ratio lock, percentage scaling
  • Crop Image - Free-form and preset aspect ratios

Edit Tools (2 Tools)

  • Rotate Image - 90°, 180°, 270° rotation with EXIF orientation handling
  • Watermark Image - Text and image overlays with opacity control

Utilities (3 Tools)

  • Image to Base64 - Convert images to data URIs for embedding
  • Base64 to Image - Decode data URIs back to downloadable files
  • Favicon Generator - Multi-resolution ICO generation (16, 32, 48, 64, 128, 256px)

Advanced Features

  • Image Workbench - Visual pipeline editor for chaining operations (convert → compress → resize → watermark)
  • EXIF Metadata Handling - Preserve or strip metadata, automatic rotation based on orientation
  • Batch Processing - Process multiple files simultaneously
  • ZIP Download - Download multiple processed files as a single ZIP archive
  • Duplicate Detection - Warns when adding the same file multiple times
  • File Size Validation - 100MB limit with clear error messages

Progressive Web App (PWA)

  • Installable - Add to home screen on mobile/desktop
  • Offline Support - Core functionality works without internet
  • Service Worker - Intelligent caching strategies
  • Auto-Updates - Prompt users when new versions are available

Complete Tool List

Format Conversion Routes

ToolRouteInputOutputDescription
PNG to JPG/png-to-jpgPNGJPGLossy compression for photos
JPG to PNG/jpg-to-pngJPGPNGLossless with transparency support
WEBP to JPG/webp-to-jpgWEBPJPGConvert modern format to standard
WEBP to PNG/webp-to-pngWEBPPNGPreserve transparency
JPG to WEBP/jpg-to-webpJPGWEBPNext-gen format conversion
PNG to WEBP/png-to-webpPNGWEBPSmaller file sizes
GIF to JPG/gif-to-jpgGIFJPGStatic frame extraction
GIF to PNG/gif-to-pngGIFPNGWith transparency
GIF to WEBP/gif-to-webpGIFWEBPModern format
BMP to JPG/bmp-to-jpgBMPJPGLegacy format conversion
BMP to PNG/bmp-to-pngBMPPNGUncompressed to compressed
TIFF to JPG/tiff-to-jpgTIFFJPGPrint to web
TIFF to PNG/tiff-to-pngTIFFPNGLossless conversion
HEIC to JPG/heic-to-jpgHEIC/HEIFJPGiPhone photo conversion
HEIC to PNG/heic-to-pngHEIC/HEIFPNGWith transparency
SVG to PNG/svg-to-pngSVGPNGVector to raster
JPG to AVIF/jpg-to-avifJPGAVIFModern compression
PNG to AVIF/png-to-avifPNGAVIFWith transparency support
WEBP to AVIF/webp-to-avifWEBPAVIFUltra-efficient compression
AVIF to JPG/avif-to-jpgAVIFJPGBackwards compatibility
AVIF to PNG/avif-to-pngAVIFPNGLossless extraction
JPG to GIF/jpg-to-gifJPGGIFLimited color palette (256)
PNG to GIF/png-to-gifPNGGIFTransparency to 1-bit alpha
WEBP to GIF/webp-to-gifWEBPGIFAnimation not supported
JPG to BMP/jpg-to-bmpJPGBMPUncompressed bitmap
JPG to TIFF/jpg-to-tiffJPGTIFFArchival format
PNG to BMP/png-to-bmpPNGBMPLoss of transparency
PNG to TIFF/png-to-tiffPNGTIFFWith alpha channel
WEBP to BMP/webp-to-bmpWEBPBMPLegacy compatibility
WEBP to TIFF/webp-to-tiffWEBPTIFFPrint quality
PNG to ICO/png-to-icoPNGICOFavicon generation
JPG to ICO/jpg-to-icoJPGICOWith white background
WEBP to ICO/webp-to-icoWEBPICOModern source

Compression Routes

ToolRouteDescription
Compress JPG/compress-jpgAdjustable quality compression
Compress PNG/compress-pngLossy compression with palette reduction
Compress WEBP/compress-webpTarget quality optimization
Compress GIF/compress-gifColor palette optimization

Resize & Crop Routes

ToolRouteFeatures
Resize Image/resize-imageCustom dimensions, aspect ratio lock, percentage
Crop Image/crop-imageFree-form, preset ratios, visual preview

Edit Routes

ToolRouteFeatures
Rotate Image/rotate-image90°, 180°, 270°, auto EXIF correction
Watermark Image/watermark-imageText/image overlay, opacity, positioning

Utility Routes

ToolRouteDescription
Image to Base64/image-to-base64Data URI generation
Base64 to Image/base64-to-imageDecode and download
Favicon Generator/ico-generatorMulti-resolution ICO package

Advanced Routes

ToolRouteDescription
Image Workbench/image-workbenchVisual pipeline editor

Legal Routes

PageRoute
Privacy Policy/privacy
Terms of Service/terms

Health Check Routes

EndpointRouteDescription
Full Health/healthDetailed system status
Uptime Check/upSimple OK response

Technology Stack

Backend

TechnologyVersionPurpose
PHP8.3+Server-side logic
Laravel12.xApplication framework
Inertia.js2.xSPA without API

Frontend

TechnologyVersionPurpose
Vue.js3.5+UI framework
Vite7.xBuild tool
Tailwind CSS4.xStyling

Image Processing

LibraryPurposeSize
Native Canvas APICore processingBuilt-in
libheif-jsHEIC/HEIF decoding1.4MB WASM
@squoosh/libAVIF encodingLazy-loaded
exif-jsEXIF metadata3KB
jszipZIP generation25KB
file-saverFile downloads2KB

Monitoring & Security

ServicePurpose
Sentry (optional)Error tracking
Laravel Security HeadersXSS/clickjacking protection

PWA

TechnologyPurpose
Service WorkerCaching & offline support
Web App ManifestInstall prompt
Workbox (custom)Cache strategies

Installation

Prerequisites

  • PHP 8.3 or higher
  • Composer 2.x
  • Node.js 18.x or higher
  • NPM 9.x or higher
  • SQLite (or MySQL/PostgreSQL)

Step-by-Step Installation

# 1. Clone the repository
git clone https://github.com/codezela/iloveimg-studio.git
cd iloveimg-studio
# 2. Install PHP dependencies
composer install --no-dev --optimize-autoloader
# 3. Install Node.js dependencies
npm ci
# 4. Environment setup
cp .env.example .env
php artisan key:generate
# 5. Database setup (SQLite default)
touch database/database.sqlite
php artisan migrate
# 6. Build production assets
npm run build
# 7. Link storage (if using local file uploads in future)
php artisan storage:link
# 8. Set proper permissions
chmod -R 755 storage
chmod -R 755 bootstrap/cache

Development Installation

# Install with dev dependencies
composer install
npm install
# Start development servers
php artisan serve
npm run dev

Configuration

Environment Variables

Edit .env file:

# Application
APP_NAME="ILoveIMG Studio"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://yourdomain.com
# Database (SQLite recommended for zero-config)
DB_CONNECTION=sqlite
# Optional: Sentry Error Tracking
SENTRY_DSN=https://xxx@yyy.ingest.sentry.io/zzz
SENTRY_ENVIRONMENT=production
VITE_SENTRY_DSN="${SENTRY_DSN}"
VITE_SENTRY_ENVIRONMENT="${SENTRY_ENVIRONMENT}"# Security Headers
SECURITY_HEADERS_ENABLED=true
CSP_ENABLED=false
CSP_REPORT_ONLY=true

Web Server Configuration

Nginx

server{listen80;listen [::]:80;server_name iloveimg.codezela.com;root /var/www/iloveimg/public;indexindex.php index.html;location / {try_files$uri$uri/ /index.php?$query_string;}location~\.php$ {fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;include fastcgi_params;} # Cache static assetslocation~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {expires1y;add_header Cache-Control "public, immutable";} # Service worker - no cachelocation = /sw.js {add_header Cache-Control "no-cache, no-store, must-revalidate";}}

Apache

<VirtualHost*:80>
ServerName iloveimg.codezela.com
DocumentRoot /var/www/iloveimg/public
<Directory/var/www/iloveimg/public>
AllowOverride All
Require all granted
</Directory>
# Enable compression
<IfModulemod_deflate.c>
AddOutputFilterByType DEFLATE text/htmltext/csstext/javascriptapplication/javascript
</IfModule>
</VirtualHost>

Usage Guide

Basic Workflow

  1. Select a Tool: Browse categories or search on homepage
  2. Upload Images: Drag & drop or click to browse
  3. Process: Click the action button
  4. Download: Individual files or ZIP archive

Batch Processing

  1. Select multiple files (hold Ctrl/Cmd)
  2. Or drag a folder of images
  3. Process all at once
  4. Download as ZIP

Image Workbench

  1. Go to /image-workbench
  2. Upload images
  3. Add operations to pipeline:
    • Convert format
    • Compress
    • Resize
    • Add watermark
  4. Run pipeline
  5. Download results

EXIF Handling

  • Preserve Metadata: Keep camera info, GPS, dates
  • Strip Metadata: Remove all EXIF for privacy
  • Auto-Rotate: Correct orientation based on EXIF

Architecture

Directory Structure

iloveimg/
├── app/
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── ImageToolController.php # Main tool controller
│ │ │ └── HealthController.php # Health checks
│ │ └── Middleware/
│ │ └── SecurityHeaders.php # Security middleware
├── bootstrap/ # Laravel bootstrap
├── config/ # Configuration files
├── database/ # Migrations & SQLite
├── public/ # Web root
│ ├── build/ # Vite build output
│ ├── ffmpeg/ # libheif WASM files
│ ├── manifest.json # PWA manifest
│ ├── robots.txt # SEO robots
│ ├── sitemap.xml # SEO sitemap
│ ├── sw.js # Service worker
│ └── ilvimg.png # App icon
├── resources/
│ ├── css/
│ │ └── app.css # Tailwind entry
│ ├── js/
│ │ ├── app.js # Vue app entry
│ │ ├── pwa.js # PWA registration
│ │ ├── Components/
│ │ │ ├── SeoHead.vue # SEO component
│ │ │ ├── ExifInfo.vue # EXIF display
│ │ │ ├── ExifToggle.vue # EXIF toggle
│ │ │ └── PwaInstallPrompt.vue # PWA install UI
│ │ ├── Composables/
│ │ │ ├── useImageProcessor.js # Image processing logic
│ │ │ └── useExif.js # EXIF handling
│ │ ├── Pages/
│ │ │ ├── Home.vue # Homepage
│ │ │ ├── PrivacyPolicy.vue # Legal page
│ │ │ ├── TermsOfService.vue # Legal page
│ │ │ ├── NotFound.vue # 404 page
│ │ │ └── Tools/
│ │ │ ├── Conversion/ # 34 conversion tools
│ │ │ ├── Compression/ # 4 compression tools
│ │ │ ├── Resize/ # 2 resize tools
│ │ │ ├── Edit/ # 2 edit tools
│ │ │ ├── Utility/ # 3 utility tools
│ │ │ └── Advanced/ # Workbench
│ │ └── Utils/
│ │ ├── icoGenerator.js # ICO creation
│ │ └── avifEncoder.js # AVIF encoding
│ └── views/
│ └── app.blade.php # Root template
├── routes/
│ └── web.php # 53 routes
├── storage/ # Logs, cache
├── tests/ # PHPUnit tests
├── composer.json # PHP dependencies
├── package.json # Node dependencies
├── vite.config.js # Vite configuration
├── tailwind.config.js # Tailwind config
└── LICENSE # MIT License

Component Architecture

AppLayout
├── Head (SEO meta tags)
├── Header (Navigation, Install button)
│ └── Install Button (PWA)
├── Main Content
│ ├── Home
│ │ ├── Hero Section
│ │ ├── Search Bar (with auto-scroll)
│ │ ├── Feature Cards
│ │ └── Tool Categories
│ ├── Tool Pages
│ │ └── BaseToolPage
│ │ ├── SeoHead
│ │ ├── FileUploader
│ │ ├── Processing Options
│ │ ├── EXIF Toggle
│ │ └── Download Section
│ └── Legal Pages
├── PwaInstallPrompt
└── Footer

SEO & Performance

SEO Implementation

  • Meta Tags: Dynamic per-page titles, descriptions, keywords
  • Open Graph: Full social sharing support (Facebook, LinkedIn)
  • Twitter Cards: Large image summary cards
  • Structured Data: JSON-LD WebApplication schema
  • Sitemap: 46 URLs with priorities
  • Robots.txt: Crawler directives
  • Canonical URLs: Duplicate content prevention

Performance Metrics

MetricTargetAchieved
First Contentful Paint<1.5s~0.8s
Largest Contentful Paint<2.5s~1.2s
Time to Interactive<3.5s~2.1s
Cumulative Layout Shift<0.1~0.02
JavaScript Bundle<100KB90KB gzipped
CSS Bundle<15KB13KB gzipped

Optimization Techniques

  • Code splitting with dynamic imports
  • Lazy loading for WASM modules
  • Image optimization via Canvas API
  • Gzip compression
  • Browser caching (1 year for assets)
  • Preconnect to external domains

Privacy & Security

Privacy Guarantees

  • No Uploads: All processing in browser
  • No Storage: Nothing saved to server
  • No Tracking: No Google Analytics, no cookies
  • No Ads: No advertising scripts
  • Local Only: Files exist only in memory

Security Headers

HeaderValueProtection
X-Frame-OptionsDENYClickjacking
X-Content-Type-OptionsnosniffMIME sniffing
X-XSS-Protection1; mode=blockXSS
Referrer-Policystrict-origin-when-cross-originPrivacy
Content-Security-PolicyConfigurableResource loading

Development

Adding a New Tool

  1. Create Vue Component:
<!-- resources/js/Pages/Tools/Category/NewTool.vue -->
<template>
<BaseToolPage
tool-name="Tool Name"
description="Tool description"
:processing-function="processFile"
/>
</template>
  1. Add Controller Method:
publicfunctionnewTool()
{
return Inertia::render('Tools/Category/NewTool', [
'toolName' => 'Tool Name',
'description' => 'Description'
]);
}
  1. Add Route:
Route::get('/new-tool', [ImageToolController::class, 'newTool']);
  1. Add to Tool Categories:
['name' => 'Tool Name', 'path' => 'new-tool'],
  1. Add to Sitemap:
<url>
<loc>https://yourdomain.com/new-tool</loc>
</url>

Testing

# Run PHPUnit tests
php artisan test# Run with coverage
php artisan test --coverage

Deployment

Docker Deployment

FROM php:8.3-fpm-alpine
# Install dependenciesRUN apk add --no-cache \
sqlite \
libpng-dev \
libjpeg-turbo-dev \
freetype-dev
# Install PHP extensionsRUN docker-php-ext-install pdo pdo_sqlite gd
# Install ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www
COPY . .
# Install dependenciesRUN composer install --no-dev --optimize-autoloader
# PermissionsRUN chown -R www-data:www-data /var/www
EXPOSE 9000
CMD ["php-fpm"]

Production Checklist

  • Set APP_ENV=production
  • Set APP_DEBUG=false
  • Configure HTTPS
  • Set up Sentry (optional)
  • Configure backups
  • Set up monitoring
  • Enable OPcache
  • Configure CDN (optional)

Troubleshooting

Common Issues

HEIC conversion fails

  • Ensure libheif WASM files are in /public/ffmpeg/
  • Check browser console for CORS errors
  • Large files may timeout (100MB limit)

AVIF conversion slow

  • AVIF encoding is CPU-intensive
  • First conversion loads WASM (subsequent are faster)
  • Browser may freeze on very large images

Install button not showing

  • Must be HTTPS (or localhost)
  • Check browser compatibility
  • May already be installed

Build fails

  • Check Node.js version (18+)
  • Delete node_modules and reinstall
  • Clear Vite cache: rm -rf node_modules/.vite

Contributing

We welcome contributions! Please follow these guidelines:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Code Standards

  • PHP: Follow PSR-12
  • JavaScript: ESLint with Vue 3 recommended
  • CSS: Tailwind CSS conventions
  • Commit messages: Conventional Commits

License

This project is licensed under the MIT License - see the LICENSE file for details.

MIT License
Copyright (c) 2025-2026 Codezela Technologies
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.

Acknowledgments

Open Source Libraries

Special Thanks

  • The WebAssembly community for making browser-based image processing possible
  • Google Chrome Labs for Squoosh and AVIF support
  • All contributors and users of ILoveIMG Studio

Support


Crafted with ❤️ by Codezela Technologies
Colombo, Sri Lanka

Live Demo · GitHub · Twitter

About

A complete Laravel + Vue 3 application. The Ultimate Browser-Based Image Processing Toolkit

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages