SnapOtter
ca2ef5b3f4
feat: add OIDC/SSO authentication ( #3 )
...
Add OpenID Connect (OIDC) authentication alongside existing
username/password login. Users can log in via any standards-compliant
OIDC provider (Keycloak, Authentik, Authelia, Google, Azure AD, Okta)
while preserving full backward compatibility.
- OIDC Fastify plugin with lazy discovery, PKCE, cookie-based sessions
- Login page OIDC button, auth hook updates, settings dialog badges
- 28 integration tests, OIDC setup guide with provider examples
- Fix pre-existing test failures (content-aware-crop, watermark, SVGZ)
- WAL checkpoint fix for SQLite test stability
Closes #3
# Conflicts:
# apps/api/src/lib/env.ts
# apps/api/src/routes/tools/watermark-image.ts
# pnpm-lock.yaml
# tests/integration/color-palette.test.ts
# tests/integration/compare.test.ts
# tests/integration/watermark-image.test.ts
2026-05-14 22:31:26 +08:00
SnapOtter
20ab04c5bd
fix(security): revert archiver v8 and @fastify/static v9 upgrades
...
archiver v8 changed its default export, breaking all ZIP-producing
tools (pdf-to-image, split, batch, favicon, bulk-rename, svg-to-raster).
Reverted to v7 -- the lodash vulnerability via archiver is _.template
which is never called directly.
@fastify/static v9 has breaking changes incompatible with the current
static file serving setup. Reverted to v8 -- the path traversal CVEs
in v8 are mitigated by the existing path traversal guards in files.ts.
Updated edge-cases test to expect 400 for >64KB settings payloads
(new security limit).
2026-05-14 16:59:40 +08:00
SnapOtter
4e64ee2779
fix(security): comprehensive security audit and hardening
...
Auth: login rate limit 30/min (was 500), global rate limit 1000/min (was
unlimited), password/username max lengths on all Zod schemas, session
invalidation on role change, API key legacy scan bounded to 100 keys.
SVG: hardened regex sanitizer with CDATA stripping, XML entity decoding,
set/animate/iframe/embed blocking, comprehensive data: URI blocking,
use element external href blocking. 11 attack payload fixtures added.
SSRF: fixed DNS rebinding TOCTOU by pinning resolved IPs via custom
HTTP/HTTPS agents. Added 6to4 and NAT64 to blocked IPv6 ranges.
Docker: capability dropping (cap_drop ALL + minimal cap_add), resource
limits (4g/8g mem, 512/1024 pids), healthcheck timeout, password
removed from startup banner, default password warning comments.
Network: CSP and HSTS applied in all environments (not just production),
stack traces removed from all error responses, internal paths stripped
from error details, per-route rate limits on uploads (60/min) and URL
fetches (200/hour).
Files: exclusive temp file creation (O_EXCL), disk space circuit
breaker, per-user storage quotas, settings payload 64KB size guard.
Python sidecar: script name allowlist in dispatcher, minimal environment
for subprocess spawns.
Dependencies: fixed 6 production CVEs (drizzle-orm, fastify, fast-uri,
@fastify/static, next, archiver/lodash). Pinned all GitHub Actions to
SHA hashes.
114 security tests added. Full OWASP Top 10 penetration test matrix
verified against production Docker container (30/30 pass after
hardening).
2026-05-13 21:33:50 +08:00
SnapOtter
446bad3b10
feat(oidc): install openid-client and @fastify/cookie
2026-05-13 18:45:59 +08:00
SnapOtter
0dbf300ef2
Merge branch 'feat/remotion-promo-videos'
...
# Conflicts:
# pnpm-lock.yaml
2026-05-08 21:29:19 +08:00
SnapOtter
aa773addb4
merge: resolve conflict with main branch in tool-registry.tsx
2026-05-08 18:55:28 +08:00
SnapOtter
ac33e4ac3c
feat(videos): add BackgroundMusic component with fade-in/fade-out
2026-05-08 16:35:31 +08:00
SnapOtter
53b717243b
fix(meme-generator): add opentype.js types, fix no-dropzone registry test
2026-05-08 16:29:44 +08:00
SnapOtter
180ec6edfb
chore: add opentype.js dependency for meme text rendering
2026-05-08 15:39:34 +08:00
SnapOtter
711ddf8deb
chore: add konva, react-konva, and editor dependencies
2026-05-06 23:01:47 +08:00
SnapOtter
0309e0f680
chore: deploy to Cloudflare Pages and update branding
...
- Add Cloudflare Pages deployment for landing page (snapotter.com) and
docs (docs.snapotter.com)
- Create deploy-landing.yml and update deploy-docs.yml workflows
- Update CI to ignore apps/landing/** paths
- Fix logo transparency (remove white background) across all apps
- Recreate social-preview.png with SnapOtter branding
- Update all docs URLs from GitHub Pages to docs.snapotter.com
- Update VitePress config: light theme default, fix llms.txt paths
- Add .vitepress/cache/ and .env.* to gitignore
2026-04-24 18:06:29 +08:00
ashim-hq
2260d696bc
feat: scaffold Next.js landing page app at apps/landing
2026-04-23 17:19:48 +08:00
ashim-hq
babca4cf97
test: comprehensive test coverage expansion (+965 tests)
...
Add 42 new test files covering all untested tool routes, image engine
internals, AI sidecar bridge, Zustand stores, and cross-format
compatibility. Expand e2e-docker suite with 7 spec files covering all
48 tools against a real Docker container.
Unit tests:
- Image engine: format detection, MIME mapping, metadata parsing, pipeline
- AI bridge: sidecar lifecycle, all 11 tool functions (mocked)
- Web stores: 14 Zustand stores (collage, settings, features, analytics, etc.)
- API helpers: format decoders, page range, file validation
Integration tests:
- 25 tool routes that had zero dedicated tests
- Cross-format matrix: 17 input formats x 3 tools
- Edge cases: zero-byte files, corrupted headers, path traversal, XSS, SQL injection
- Concurrent request handling and pipeline edge cases
E2E-Docker (Playwright against real container):
- 7 spec files: essential, adjustment, conversion, creative, utility, AI, pipeline
- Custom buildMultipart helper for multi-file tool uploads
- AI tools gracefully skip when sidecar not installed
Fixtures:
- Organized test media: formats/ (18 formats) + content/ (17 content types)
- Reduced from 3.1 GB unorganized samples to 33 MB structured fixtures
Bug fix:
- color-adjustments: gamma exposure used invalid single-param gamma() for
positive values; fixed to use two-param gamma(gammaIn, gammaOut) form
2026-04-23 17:12:02 +08:00
ashim-hq
544f81c48d
feat: add frontend analytics wrapper and consent store
2026-04-22 19:07:50 +08:00
ashim-hq
075f017dbf
feat: add backend analytics wrapper, config/consent API routes
2026-04-22 19:03:23 +08:00
ashim-hq
db1137d94b
chore: add @use-gesture/react for collage touch interactions
2026-04-19 15:46:02 +08:00
Siddharth Kumar Sah
85b1cfc10a
chore: rename Stirling-Image to ashim across entire codebase
...
Complete rebrand from Stirling-Image to ashim following the project
move to https://github.com/ashim-hq/ashim .
Changes across 117 files:
- Package scope: @stirling-image/* → @ashim/*
- GitHub URLs: stirling-image/stirling-image → ashim-hq/ashim
- Docker Hub: stirlingimage/stirling-image → ashimhq/ashim
- GitHub Pages: stirling-image.github.io → ashim-hq.github.io
- All branding text: "Stirling Image" → "ashim"
- Docker service/volumes/user: stirling → ashim
- Database: stirling.db → ashim.db
- localStorage keys: stirling-token → ashim-token
- Environment variables: STIRLING_GPU → ASHIM_GPU
- Python cache dirs: .cache/stirling-image → .cache/ashim
- SVG filter IDs, test prefixes, and all other references
2026-04-14 20:55:42 +08:00
fb33a46a64
feat: SOTA overhaul of automate pipeline page ( #53 )
...
* feat(find-duplicates): upgrade to 128-bit dHash with metadata and thumbnails
* feat(find-duplicates): add custom-results display mode and duplicate store
* feat(find-duplicates): add results overview grid and detail comparison view
* feat(find-duplicates): overhaul settings with sensitivity presets and download actions
* feat(find-duplicates): update i18n description
* chore: replace jsqr with zxing-wasm for barcode reading
* feat(barcode-read): rewrite backend with zxing-wasm for all barcode types
* feat(barcode-read): rewrite frontend with multi-file, results table, progress, export
- Multi-file sequential processing with per-file progress
- Structured results table with type badges and copy per-result
- Copy All and Export CSV functionality
- Thorough scan toggle (maps to tryHarder in zxing-wasm)
- Before/after view shows annotated image with bounding boxes
- Updated tool description in constants and i18n
* feat(stitch): update tool name and description for redesign
* feat(stitch): add grid layout, alignment, border, radius, quality, and new resize modes
* feat(stitch): redesign settings UI with grid, alignment, border, radius, quality
* test(stitch): add stitch to e2e tool navigation suite
* feat(vectorize): redesign with dual-engine backend and preset-driven UI
- Backend: potrace for B&W, VTracer (@neplex/vectorizer) for full-color vectorization
- Frontend: 5 presets (logo, illustration, photo, sketch, custom)
- Settings: color precision, gradient step, detail, smoothing, corner threshold, invert
- Updated OpenAPI spec and i18n description
* feat(border): redesign with presets, shadow, padding color, swatches
- Add 8 one-click presets (Clean White, Gallery Black, Shadow, Rounded, Polaroid, Vintage, Minimal, Cinematic)
- Implement proper shadow rendering with blur, offset X/Y, color, opacity
- Add padding color control (was hardcoded white)
- Add color swatches for quick color selection
- Wrap in form for Enter key submission
- Add smart validation (requires at least one effect active)
- Align frontend/backend slider ranges
- Organize UI with sections and collapsible shadow toggle
* feat(split): overhaul image splitting with live grid overlay and tile preview
- Add interactive-split display mode with SplitCanvas component
- Live SVG grid overlay on uploaded image showing split boundaries
- Two split modes: Grid (NxM) and Tile Size (px dimensions)
- 9 grid presets (2x1, 1x2, 2x2, 3x1, 1x3, 3x3, 2x3, 3x2, 4x4)
- Output format selection (original/PNG/JPG/WebP) with quality slider
- Post-split tile preview thumbnails with individual download
- Download All as ZIP button
- HEIC/HEIF preview with loading spinner
- Backend: tile-size mode, output format conversion, quality control
- Zustand store for split state management
* feat(split): rewrite backend and frontend settings
Backend: tile-size mode, output format conversion, quality control.
Frontend: split modes, presets, format selector, tile preview grid.
* feat(border): add live CSS preview and remove before/after slider
- Add imageWrapperStyle prop to ImageViewer for live border preview
- Add onImageStyle callback through tool-page to settings components
- Change border displayMode to no-comparison (no slider)
- BorderControls sends live CSS styles (border, padding, radius, shadow)
- Preview updates instantly as user adjusts sliders or clicks presets
* fix: repair i18n file corrupted by formatter during merge conflict resolution
* feat(border): enable live CSS preview in right pane as settings change
* fix(border): keep CSS preview visible after processing for WYSIWYG consistency
* chore: add @dnd-kit/core and @dnd-kit/sortable for pipeline drag-and-drop
* feat(pipeline): add Zustand store for pipeline step management
* feat(automate): add pipeline step settings summary utility with tests
* feat(automate): add POST /api/v1/pipeline/batch for multi-file pipeline execution
* feat(automate): add usePipelineProcessor hook for single and batch pipeline execution
* fix(automate): pass settings prop to all pipeline step controls for state restoration
* feat(automate): rewrite pipeline builder with dnd-kit drag-and-drop and compact step cards
* feat(automate): rewrite page with two-panel layout, image preview, and batch support
* test(automate): update e2e tests for new two-panel pipeline layout
---------
Co-authored-by: Siddharth Kumar Sah <siddharth123sk@gmail.com >
2026-04-13 16:26:38 +08:00
a1e11dff74
feat(gif-tools): SOTA upgrade with 6 processing modes ( #52 )
...
* feat(find-duplicates): upgrade to 128-bit dHash with metadata and thumbnails
* feat(find-duplicates): add custom-results display mode and duplicate store
* feat(find-duplicates): add results overview grid and detail comparison view
* feat(find-duplicates): overhaul settings with sensitivity presets and download actions
* feat(find-duplicates): update i18n description
* chore: replace jsqr with zxing-wasm for barcode reading
* feat(barcode-read): rewrite backend with zxing-wasm for all barcode types
* feat(barcode-read): rewrite frontend with multi-file, results table, progress, export
- Multi-file sequential processing with per-file progress
- Structured results table with type badges and copy per-result
- Copy All and Export CSV functionality
- Thorough scan toggle (maps to tryHarder in zxing-wasm)
- Before/after view shows annotated image with bounding boxes
- Updated tool description in constants and i18n
* feat(stitch): update tool name and description for redesign
* feat(stitch): add grid layout, alignment, border, radius, quality, and new resize modes
* feat(stitch): redesign settings UI with grid, alignment, border, radius, quality
* test(stitch): add stitch to e2e tool navigation suite
* feat(vectorize): redesign with dual-engine backend and preset-driven UI
- Backend: potrace for B&W, VTracer (@neplex/vectorizer) for full-color vectorization
- Frontend: 5 presets (logo, illustration, photo, sketch, custom)
- Settings: color precision, gradient step, detail, smoothing, corner threshold, invert
- Updated OpenAPI spec and i18n description
* feat(border): redesign with presets, shadow, padding color, swatches
- Add 8 one-click presets (Clean White, Gallery Black, Shadow, Rounded, Polaroid, Vintage, Minimal, Cinematic)
- Implement proper shadow rendering with blur, offset X/Y, color, opacity
- Add padding color control (was hardcoded white)
- Add color swatches for quick color selection
- Wrap in form for Enter key submission
- Add smart validation (requires at least one effect active)
- Align frontend/backend slider ranges
- Organize UI with sections and collapsible shadow toggle
* feat(split): overhaul image splitting with live grid overlay and tile preview
- Add interactive-split display mode with SplitCanvas component
- Live SVG grid overlay on uploaded image showing split boundaries
- Two split modes: Grid (NxM) and Tile Size (px dimensions)
- 9 grid presets (2x1, 1x2, 2x2, 3x1, 1x3, 3x3, 2x3, 3x2, 4x4)
- Output format selection (original/PNG/JPG/WebP) with quality slider
- Post-split tile preview thumbnails with individual download
- Download All as ZIP button
- HEIC/HEIF preview with loading spinner
- Backend: tile-size mode, output format conversion, quality control
- Zustand store for split state management
* feat(split): rewrite backend and frontend settings
Backend: tile-size mode, output format conversion, quality control.
Frontend: split modes, presets, format selector, tile preview grid.
* feat(border): add live CSS preview and remove before/after slider
- Add imageWrapperStyle prop to ImageViewer for live border preview
- Add onImageStyle callback through tool-page to settings components
- Change border displayMode to no-comparison (no slider)
- BorderControls sends live CSS styles (border, padding, radius, shadow)
- Preview updates instantly as user adjusts sliders or clicks presets
* fix: repair i18n file corrupted by formatter during merge conflict resolution
* feat(border): enable live CSS preview in right pane as settings change
* fix(border): keep CSS preview visible after processing for WYSIWYG consistency
* chore(gif-tools): scaffold for SOTA upgrade
- Add animated GIF test fixture (3 frames, 100x100)
- Update tool description to reflect new capabilities
- Add fflate dependency to API for ZIP creation
* feat(gif-tools): rewrite backend with 6 processing modes
Modes: resize (with percentage), optimize (colors/dither/effort),
speed (delay manipulation), reverse (frame reorder), extract
(single/range/all with ZIP), rotate (90/180/270 + flip).
Adds /api/v1/tools/gif-tools/info metadata endpoint.
* test(gif-tools): add integration tests for all 6 modes
Tests metadata endpoint, resize (pixel + percentage), optimize,
speed, reverse, extract (single/range/all), and rotate (angle + flip).
Fix animated.gif fixture to be a real 3-frame animation (was a single
100x300 frame). Fix reverse and rotate modes to process frames
individually and reassemble via GIF binary concatenation, since
Sharp 0.33.x loses page-height metadata when reconstructing from raw
pixel data.
* feat(gif-tools): rewrite frontend with tabbed 6-mode UI
- useGifInfo hook for metadata (frame count, dimensions, duration)
- Info bar showing GIF properties
- 3x2 mode grid: Resize, Optimize, Speed, Reverse, Extract, Rotate
- Animation modes disabled for static images
- Loop control (infinite/once/custom)
- Batch processing support
* test(gif-tools): add to representative tools in e2e suite
---------
Co-authored-by: Siddharth Kumar Sah <siddharth123sk@gmail.com >
2026-04-13 16:23:07 +08:00
Siddharth Kumar Sah
15cf7e2f27
feat(qr-generate): add qr-code-styling library for styled QR generation
2026-04-13 02:50:36 +08:00
Siddharth Kumar Sah
dde70f70ad
feat: comprehensive HEIC/HEIF support and edit-metadata ExifTool overhaul
...
- Add ensureSharpCompat() helper for automatic HEIC detection and decode
- Fix HEIC support in all 14 custom-route tools (image-to-pdf, split,
barcode-read, compose, collage, stitch, compare, find-duplicates,
color-palette, watermark-image, vectorize, favicon, info, branding)
- Fix PdfPagePreview using store's decoded blobUrl instead of raw File
- Add onError fallback in ImageViewer for unrenderable formats
- Fix image-to-pdf progress bar with flushSync for reliable rendering
- Add ExifTool backend for edit-metadata (GPS, keywords, IPTC, dates)
- Rename Strip Metadata to Remove Metadata with interactive Leaflet map
- Fix user-files thumbnail generation for stored HEIC files
- Fix info tool stats() histogram for HEIC via decoded buffer
- Skip HEIC preprocessing in batch route for metadata tools
2026-04-12 08:50:19 +08:00
Siddharth Kumar Sah
d650f301ca
chore: add mupdf dependency for PDF-to-image tool
2026-04-10 20:56:13 +08:00
Siddharth Kumar Sah
6a362d6443
feat(docs): auto-generate llms.txt via vitepress-plugin-llms
...
Replace static llms.txt and llms-full.txt with auto-generated versions
that stay in sync with docs on every build. The plugin also generates
per-page .md files for individual page fetching by LLMs.
2026-04-08 00:53:26 +08:00
Siddharth Kumar Sah
723c79491e
feat: add EditMetadataOptions type and exif-reader dep to image-engine
2026-04-06 19:09:18 +08:00
stirling-image and GitHub
449a2fc319
feat: lightweight Docker image without AI/ML tools (:lite tag)
...
Closes #1
2026-04-05 00:23:21 +08:00
Siddharth Kumar Sah
1cbdfa1590
feat: add worker threads, persistent Python sidecar, graceful shutdown, and architectural improvements
...
- Graceful shutdown: SIGTERM/SIGINT handlers drain HTTP, stop workers, close DB
- Thumbnail caching: disk-cached thumbnails with immutable Cache-Control headers
- Worker thread pool: Piscina offloads Sharp processing off the main event loop
- Persistent Python dispatcher: pre-imports ML libraries, eliminates cold-start latency
- Tool page registry: declarative tool-to-component mapping replaces 750-line switch
- File store cleanup: remove dead derived fields, stable files array reference
- Job persistence: progress written to SQLite jobs table, stale jobs recovered on startup
2026-03-29 17:23:41 +08:00
Siddharth Kumar Sah
cff1930920
feat(api): add llms.txt and llms-full.txt endpoints
...
Serve LLM-friendly documentation at /llms.txt (index) and
/llms-full.txt (full API docs as markdown). Generated from the
OpenAPI spec at startup.
2026-03-27 13:50:04 +08:00
Siddharth Kumar Sah
abb2916233
feat(api): add Scalar docs route and install dependency
2026-03-27 13:50:03 +08:00
Siddharth Kumar Sah
585d66f0c9
refactor: rename Tool.alpha to Tool.experimental
2026-03-26 01:10:51 +08:00
Siddharth Kumar Sah
0aa2a5e5de
chore: remove swagger deps, parallelize CI jobs
...
- Remove @fastify/swagger and @fastify/swagger-ui (API docs live on GitHub Pages)
- Run typecheck, build, and docker CI jobs in parallel instead of sequentially
2026-03-24 00:41:54 +08:00
Siddharth Kumar Sah
31d426ff6f
feat(crop): add react-image-crop dependency
2026-03-23 19:17:02 +08:00
Siddharth Kumar Sah
80756d1591
feat: merge multi-image UX — batch processing, filmstrip navigation, resize/rotate redesign
...
Integrates feature/multi-image-ux branch with 20 commits including:
- Multi-image viewer with arrow navigation and filmstrip thumbnails
- Batch processing across all tool settings components
- File store rewrite with FileEntry model for multi-image support
- Resize settings redesigned with tab-based UI (presets, custom, scale)
- Side-by-side comparison for resize results
- Per-file metadata caching in strip-metadata
- Client-side ZIP extraction via fflate
- SSE progress correlation via clientJobId
2026-03-23 17:13:10 +08:00
Siddharth Kumar Sah
0e7348a0be
fix: unify project on port 1349, improve strip-metadata and UI components
...
Consolidate all access to localhost:1349 — Vite dev server serves on 1349
and proxies API calls to an internal dev port (13490). Production API
defaults to 1349. Also includes strip-metadata improvements, UI component
updates, and compress operation fixes.
2026-03-23 16:38:27 +08:00
Siddharth Kumar Sah
890ed21617
chore: add fflate for client-side ZIP extraction
2026-03-23 12:55:10 +08:00
Siddharth Kumar Sah
80e536bcf8
chore: remove dead code, add test infrastructure, update docs
...
- Delete 3 dead files: use-batch-processor.ts, use-i18n.ts, smart-crop.ts (AI package)
- Remove dead getJobProgress function and unused runPythonScript wrapper
- Remove 6 unused imports across API and web apps
- Remove unused shared types (ImageFormat, AppConfig, ApiError, HealthResponse, JobProgress)
and constants (SUPPORTED_INPUT_FORMATS/OUTPUT_FORMATS, DEFAULT_OUTPUT_FORMAT)
- Remove unused store method (setOriginalBlobUrl) and clean AI package re-exports
- Add test infrastructure: vitest config, unit/integration/e2e tests, fixtures, screenshots
- Add Docker test infrastructure: Dockerfile.test, docker-compose.test.yml
- Add download_models.py for pre-baking AI model weights in Docker
- Add filename sanitization utility (apps/api/src/lib/filename.ts)
- Update .gitignore to exclude coverage/, *.tsbuildinfo, .superpowers/, test artifacts
- Update .dockerignore to exclude test/coverage/IDE artifacts from builds
- Update docs: remove smart crop from AI docs (uses Sharp directly), update bridge docs
2026-03-23 11:46:45 +08:00
Siddharth Kumar Sah
4807bd2726
feat: add semantic-release for automated versioning and help dialog
...
- Set up semantic-release with zero-touch CI pipeline on push to main
- Add version sync script to keep all package.json files and APP_VERSION
constant in sync automatically
- Consolidate Docker publishing into single tag-triggered workflow that
pushes to both Docker Hub and ghcr.io with semver tags
- Add help dialog with keyboard shortcuts, getting started guide, and
resource links
- Sync all versions to 0.2.1 to match Docker Hub latest
2026-03-22 21:25:14 +08:00
Siddharth Kumar Sah
cf68eaf732
chore: update lockfile for docs workspace
2026-03-22 21:01:36 +08:00
Siddharth Kumar Sah
ce03aad10f
feat: production Docker, Playwright tests, settings API, and bug fixes
...
- Add user management endpoints (register, list, delete, change password)
- Add API key management (create, list, delete)
- Add settings persistence endpoints (get, put)
- Wire settings dialog to real backend (People, API Keys, System, Security)
- Fix login auth flow (window.location.href for full reload)
- Fix download URLs returning 401 (make public since UUIDs are unguessable)
- Fix border tool shadowColor validation (accept 6-8 hex digits)
- Fix remove-bg alpha matting fallback (retry without on failure)
- Fix AI tool silent fallbacks (report errors instead of no-ops)
- Add checkerboard background to before/after slider for transparency
- Add progress bars to all AI tool components
- Add Playwright E2E test suite (131 tests across 9 test files)
- Rewrite Dockerfile for production (tsx runtime, pre-baked AI models)
- Add .dockerignore for faster builds
- Add proper accessible labels to login form
2026-03-22 19:28:57 +08:00
Siddharth Kumar Sah
5524939b6f
feat: add Phase 4 AI tools with Python bridge and 6 new tools
...
Add Python bridge (packages/ai/src/bridge.ts) that calls Python scripts
via child_process with venv-first fallback to system python3. Implements
6 AI-powered tools:
- Remove Background: rembg-based with U2-Net/IS-Net models
- Image Upscaling: Real-ESRGAN with Lanczos fallback
- OCR/Text Extraction: Tesseract + PaddleOCR engines
- Face/PII Blur: MediaPipe face detection with configurable blur
- Object Eraser: LaMa inpainting with mask-based input
- Smart Crop: Sharp attention-based entropy cropping (no Python needed)
Each tool includes: Python script, TypeScript wrapper, API route,
and React settings component. All Python scripts handle ImportError
gracefully with clear installation messages.
2026-03-22 04:31:49 +08:00
Siddharth Kumar Sah
9c55dd32c4
feat: add replace-color tool and update tool page routing
...
- Add replace-color tool with pixel-level color replacement and tolerance
- Register all 19 new Phase 3 tools in routes/tools/index.ts
- Map all new tool IDs to settings components in tool-page.tsx
- Add PDF, ZIP, ICO, JSON content types to download route
- Install qrcode, jsqr, potrace, pdfkit dependencies
2026-03-22 04:21:10 +08:00
Siddharth Kumar Sah
ce641168c1
feat(api,web): add batch processing with ZIP download and SSE progress
...
Backend: POST /api/v1/tools/:toolId/batch accepts multiple files +
settings, processes via p-queue with CONCURRENT_JOBS concurrency limit,
streams ZIP response using archiver. Tool registry in tool-factory
enables batch to reuse any registered tool's process function. SSE
endpoint at GET /api/v1/jobs/:jobId/progress provides real-time updates.
Handles partial failures gracefully, preserves filenames, deduplicates
collisions. Frontend: use-batch-processor hook handles upload, SSE
progress tracking, and automatic ZIP download.
2026-03-22 04:03:38 +08:00
Siddharth Kumar Sah
ece341e8c4
feat(api): add multipart file upload, workspace management, and download routes
...
- Register @fastify/multipart plugin with size limits from env config
- Workspace manager: createWorkspace, getWorkspacePath, cleanupWorkspace
- File validation: magic byte detection, format check, megapixel limit
- POST /api/v1/upload: multipart upload with validation, returns jobId + file metadata
- GET /api/v1/download/:jobId/:filename: serve files with Content-Disposition
- Path traversal guards on all file-serving endpoints
- Add @stirling-image/image-engine and sharp as API dependencies
- Add apiUpload, getDownloadUrl, apiDownloadBlob to web client
2026-03-22 03:47:54 +08:00
Siddharth Kumar Sah
5fa012e44b
feat: add Vite + React SPA with Tailwind CSS and routing
2026-03-22 02:57:49 +08:00
Siddharth Kumar Sah
a24c6dd014
feat: add SQLite database with Drizzle ORM schema and migrations
2026-03-22 02:51:57 +08:00
Siddharth Kumar Sah
1e7fb11da0
feat: add Fastify API server with health check and env config
2026-03-22 02:46:34 +08:00
Siddharth Kumar Sah
f210de1a13
feat: add shared package with types, tool definitions, and constants
2026-03-22 02:44:43 +08:00
Siddharth Kumar Sah
58fbb38fd8
feat: initialize Turborepo monorepo with pnpm workspaces
2026-03-22 02:41:44 +08:00