Commit Graph
631 Commits
Author SHA1 Message Date
SnapOtter 826f1efc08 feat: filter files by modality when importing from tool page
When clicking "Import from Files" on an image tool, only image files
are shown in the library. Video tools see only videos, audio tools
only audio. Uses MIME type prefix filtering (image/, video/, audio/).
Document and data tools see all files since their MIME types vary.
2026-06-14 23:26:38 +08:00
SnapOtter aff9159ae0 feat: move theme toggle and language selector to top nav bar
Theme toggle (sun/moon) and language selector (globe + dropdown) now
live in the top nav's right section alongside help and avatar.
Removed the floating Footer component from the home page since its
contents are now in the nav bar.
2026-06-14 23:13:38 +08:00
SnapOtter f4061fe4b0 fix: Save to Files shows green success state with checkmark after saving 2026-06-14 23:10:20 +08:00
SnapOtter d0795b69ea feat: disable auto-save, add Save to Files button, accept all file types in library
- Disabled auto-save of processed files to library (worker no longer
  calls autoSaveToLibrary)
- Added "Save to Files" button in the review panel for explicit saving
- Files library upload area now accepts all file types, not just images
- Removed "Drop images here" hardcoded text, replaced with i18n
- Removed image-only file filter from library upload
2026-06-14 21:53:42 +08:00
SnapOtter b8a6b2018e feat: Import from Files works, remove pipeline button from files page
- Import from Files now navigates back to the tool page with the
  selected file loaded (uses selectForTool router state)
- Tool page skips file store reset when arriving from the library
- Removed "Open in Pipeline" button from file details and file list
- Button text changes to "Select File" when in file-selection mode
2026-06-14 21:43:58 +08:00
SnapOtter b5eef644e3 feat: clean tool page nav, add Import from Files on dropzone
- Removed Automate/Editor/Files links from top nav on tool pages,
  keeping only the breadcrumb + help + avatar for a cleaner look
- Added "Import from Files" link on the tool dropzone that navigates
  to the file library, letting users import previously processed files
2026-06-14 21:37:15 +08:00
SnapOtter f32b3bd51f fix: clear file store when navigating between tools
Changed undoProcessing() to reset() on toolId change so files don't
persist when navigating from one tool to another. Previously a video
file from a video tool would carry over to an image tool.
2026-06-14 21:32:27 +08:00
SnapOtter 90acd5bcd9 fix: show image viewer for video-to-gif/webp results instead of broken video player
When a video tool produces a non-video output (gif, webp, png), the
media player can't render it. Now detects the processed file extension
and switches to ImageViewer for image outputs while keeping the video
player for the input preview.
2026-06-14 21:30:54 +08:00
SnapOtter 69300b5c83 fix: use media-player for all video/audio tools that had no-comparison or side-by-side
video-to-webp, video-to-frames, auto-subtitles, extract-subtitles,
video-metadata, and audio-metadata were using display modes that
render via ImageViewer, which can't display video/audio files
(shows "Preview not available"). Changed to media-player so they
get proper video player or waveform visualization.
2026-06-14 21:27:26 +08:00
SnapOtter d8a8e05590 feat: add audio waveform visualization with wavesurfer.js
Replace the basic HTML5 audio element with an interactive waveform
player for audio tool pages. Video tools continue using the existing
MediaPlayerView component.
2026-06-14 21:25:34 +08:00
SnapOtter 5241ccd124 fix: show tool-specific accepted formats in dropzone, remove privacy note
The inner Dropzone was showing generic "Images, Videos, Audio, PDFs..."
text. Now it shows the tool's actual accepted formats (e.g., "MP4, MOV,
WEBM, MKV..." for video tools) via the acceptDescription prop.
Removed the privacy note text per user feedback.
2026-06-14 21:18:45 +08:00
SnapOtter 207c1c348b fix: make search bar full-width to align with tabs and grid 2026-06-14 21:09:42 +08:00
SnapOtter 43b190134e fix: top nav respects dark mode theme
Changed bg-white to bg-background so the top nav bar adapts to the
app's dark/light theme via CSS variables instead of being hardcoded
to white.
2026-06-14 21:08:34 +08:00
SnapOtter ade79c53a5 feat: polish home page UI -- card borders, colored icons, 3-col grid, Cmd+K hint
- Tool cards: subtle border, modality-colored icon backgrounds, better hover
- Category headers: bottom border separator for visual structure
- Grid: 3 columns on lg screens instead of 2
- Search bar: Cmd+K keyboard shortcut hint, tighter styling
- Tabs: softer styling, count separated from label
- Recent pills: subtler border style instead of bright orange
- Tighter vertical spacing throughout
- Wider max-width (max-w-6xl) for better use of screen space
2026-06-14 21:03:52 +08:00
SnapOtter fd26fa3586 fix: remove all legacy redirects from routes
Removed /fullscreen redirect, old color tool redirects, and legacy
/:toolId redirect. Clean route table with only active routes.
2026-06-14 20:56:46 +08:00
SnapOtter ea83e1c8b4 feat: modality-based URLs (/image/resize, /video/compress-video)
Tool routes now include the modality prefix: /image/crop, /video/trim-video,
/audio/convert-audio, /document/merge-pdf, /data/csv-json. Old URLs
(e.g. /resize) redirect to the new modality-prefixed path automatically.

Routes are computed by prepending MODALITY_URL_SLUG to each tool's route
in the TOOLS array at module init. The App.tsx route changed from
/:toolId to /:modality/:toolId, with a LegacyToolRedirect fallback.
2026-06-14 20:54:29 +08:00
SnapOtter 914ff1b1aa fix: prevent double scrollbar by locking html/body overflow
Added overflow: hidden to html and body, height: 100% to html/body/#root.
Only the <main> element inside AppLayout scrolls. This prevents the
browser's default body scroll from creating a second scrollbar alongside
the app's own scroll container.
2026-06-14 20:47:19 +08:00
SnapOtter ae959760e3 fix: remove double scrollbar on home page
Main element in AppLayout now handles scrolling (overflow-y-auto).
Removed redundant overflow-y-auto from home page wrapper.
2026-06-14 20:44:17 +08:00
SnapOtter b166f47de5 fix: show all tools on All tab, remove Popular and Browse sections
All tab now shows the full tool list grouped by category (same as
modality tabs). Removed Getting Started, Popular, and Browse by
Category sections for a simpler, direct experience.
2026-06-14 20:40:45 +08:00
SnapOtter 287f6f15de fix: remove redundant Getting Started section from home page
The Getting Started section duplicated tools already shown in
Popular. Now first-time users (no recents) go straight to Popular
and Browse by Category.
2026-06-14 20:37:11 +08:00
SnapOtter cf543f6976 fix: fetch settings on home page mount so tools are visible
The old home page called fetchSettings() on mount. The rewrite
dropped that call, so the settings store never loaded and
visibleTools was always empty (0 tools shown).
2026-06-14 20:34:59 +08:00
SnapOtter f68fcb8ca6 fix: cache useSyncExternalStore snapshot to prevent infinite re-render
getSnapshot() was calling JSON.parse() on every invocation, returning
a new array reference each time. useSyncExternalStore uses Object.is
comparison, so it saw a "new" value on every render and triggered
an infinite update loop. Fix by caching the parsed result and only
re-parsing when the raw localStorage value changes.
2026-06-14 20:31:49 +08:00
SnapOtter bc3ad2b008 feat: copy-primary for data tools, download-all label for multi-output, batch failure display 2026-06-14 19:38:47 +08:00
SnapOtter 896acda7ed feat: mobile layout for tool-first flow 2026-06-14 19:32:04 +08:00
SnapOtter 433d59c726 feat: tiered processing feedback and upload progress indicator 2026-06-14 19:27:59 +08:00
SnapOtter 56cd843482 feat: inline error messages with recovery actions 2026-06-14 19:24:12 +08:00
SnapOtter 619f61b470 fix: reassign 4 tools to correct display modes
bulk-rename: before-after -> no-comparison (renaming has no visual change)
image-to-pdf: before-after -> no-comparison (format conversion, not visual)
video-to-gif: side-by-side -> media-player (input is video)
chart-maker: no-comparison -> no-dropzone (generator tool)

8 tools targeting custom-results skipped: ocr, barcode-read, favicon,
auto-subtitles, video-to-frames, color-palette, info, histogram lack
ResultsPanel components and would crash at runtime.
2026-06-14 19:20:23 +08:00
SnapOtter 7c9ca85952 feat: add Cmd+Enter (process) and Cmd+S (download) keyboard shortcuts 2026-06-14 19:17:34 +08:00
SnapOtter 6ea515ccdd feat: add page-level drop overlay and paste handler on tool page 2026-06-14 19:09:36 +08:00
SnapOtter 45121c1a1e feat: add settings slide-in, review panel with size delta, start-over preserving settings 2026-06-14 19:03:13 +08:00
SnapOtter f2ac05747e feat: add full-width dropzone state and tool branding to tool page 2026-06-14 18:55:06 +08:00
SnapOtter 0d751b7d14 feat: rewrite home page as tool-first browser with search and modality tabs 2026-06-14 18:46:16 +08:00
SnapOtter 6c61ae47f4 feat: add recent tools tracking via localStorage 2026-06-14 18:36:28 +08:00
SnapOtter f9ebb304db feat: remove /fullscreen route, add dynamic page titles 2026-06-14 18:34:32 +08:00
SnapOtter 71fef439a0 feat: replace sidebar with top nav bar across all pages
Remove the Sidebar and ToolPanel components, replacing them with the
TopNav bar integrated into AppLayout. Strip the home page to a minimal
placeholder (Task 6 will rebuild it as a tool browser). Add breadcrumb
navigation to tool pages showing modality and tool name.
2026-06-14 18:30:32 +08:00
SnapOtter f79958a622 feat: add TopNav and AvatarDropdown components 2026-06-14 18:25:02 +08:00
SnapOtter 5af1ac4dcf fix: update privacy policy to reference PostgreSQL instead of SQLite 2026-06-14 18:16:54 +08:00
SnapOtter f9ed5d125a Merge branch 'feat/enterprise-on-prem' 2026-06-14 16:10:15 +08:00
SnapOtter bcd59c20c7 feat(web): apply Otter Orange design system and UI improvements
Adopt the landing page's Otter Orange (#E07832) design system across
the web app, replacing the generic blue (#2563eb) theme. Light mode
uses warm cream/stone neutrals, dark mode uses deep brown tones.

UI changes:
- Remove Quick Actions section from home page
- Add modality filter tabs to file-uploaded view
- Remove colored left-border accents from tool panels and grid cards
- Use standard dropzone for pdf-to-image (custom-results mode)
- Fix PDF document viewer to use ArrayBuffer instead of blob URL
- Fix missing FileImage import in dropzone
2026-06-14 14:06:25 +08:00
SnapOtter d397f57667 feat(web): add MFA login prompt and security settings UI
Handle MFA challenge in login flow (TOTP code input after password
verification, recovery code hint, back navigation). Add admin security
settings section with session idle timeout, max sessions per user,
MFA policy selector, SSO enforcement toggle with break-glass username,
and password policy controls. Propagate new i18n keys to all 21 locales.
2026-06-13 23:00:33 +08:00
SnapOtter 0c4468a004 feat(enterprise): add SSO enforcement mode with break-glass admin 2026-06-13 22:32:16 +08:00
SnapOtter 54132d1833 feat(enterprise): add SAML 2.0 SSO with SP-initiated login
Implements SAML SSO using @node-saml/node-saml, gated behind
SAML_ENABLED env var and the saml_sso enterprise license feature.

- SAML env vars (entity ID, callback URL, IdP SSO URL, IdP cert,
  auto-create/auto-link users, default role, provider name,
  username/email attribute mapping) with validation in superRefine
- SAML plugin with three routes: metadata (GET), login (GET),
  and ACS callback (POST with form-urlencoded content type parser)
- Callback uses the shared external-auth resolver for user
  resolution (same pattern as OIDC: match/link/create/deny)
- Auth config endpoint exposes samlEnabled and samlProviderName
- Session loginMethod detection updated for SAML auth provider
- Frontend login page shows SAML SSO button when enabled
- i18n strings for SAML error messages across all 21 locales
2026-06-13 22:27:56 +08:00
SnapOtter c7e9b1ddc6 feat(web): add storage dashboard and team retention settings
Add per-team storage breakdown table to the usage section (from
GET /api/v1/admin/usage teamStorage data). Add storage quota (MB)
and retention (hours) inline fields to the teams section, saving
via PUT /api/v1/teams/:id. Add i18n keys to all 21 locale files.
2026-06-13 21:20:12 +08:00
SnapOtter c6f9a29687 feat(web): complete audit log viewer with IP column and all event types 2026-06-13 16:42:10 +08:00
SnapOtter 3016571c2b feat(web): add data retention settings to admin UI 2026-06-13 16:39:22 +08:00
SnapOtter b8b6b0a44a fix(web): update dropzone to accept all file types, not just images 2026-06-13 15:50:52 +08:00
SnapOtter 3114323d07 fix(web): add modality to fuse search keys, merge docs+files in fullscreen grid 2026-06-13 15:43:50 +08:00
SnapOtter 888d243a65 feat(web): show icon + text labels on modality filter tabs 2026-06-13 15:39:32 +08:00
SnapOtter cc06c802c1 feat(web): icon-only modality tabs, merge documents and files 2026-06-13 15:35:19 +08:00
SnapOtter dab31d6e32 fix(web): wrap modality tabs to prevent overflow in narrow sidebar 2026-06-13 15:31:12 +08:00