Commit Graph
621 Commits
Author SHA1 Message Date
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
SnapOtter 1181b1fe22 fix(web): restore preview panel rendering for all file types
The home-page preview panel always rendered ImageViewer regardless of the
uploaded file's modality, causing videos, audio, PDFs, and data files to
show "Preview not available". Root cause: the preview branching only
checked for a blob URL and assumed all files were images.

Fix: branch on currentEntry.previewKind so the existing MediaPlayerView,
DocumentView, and a file-info fallback are activated for their respective
modalities. Also widen the AppLayout dropzone from image-only to all file
types so non-image files can reach the home page in the first place.
2026-06-13 15:19:58 +08:00
SnapOtter 8adceaf92d feat(web): modality filter tabs in sidebar tool panel
Add horizontal filter tabs (All, Image, Video, Audio, Documents, Files)
above the search bar so users can instantly scope the 157-tool catalog to
one modality. Active tab uses the modality accent color. In "all" mode
file-modality tools remain merged into the document section; selecting a
specific modality tab shows only that modality with its own header.
2026-06-13 15:19:48 +08:00
SnapOtter 3db1b3bafd feat(web): stronger modality section visual hierarchy in tool catalog 2026-06-13 15:00:47 +08:00
SnapOtter 22cccd46c4 feat(web): fuzzy search with fuse.js for typo-tolerant tool discovery 2026-06-13 14:58:25 +08:00
SnapOtter 82fb798142 feat(web): modality tabs on fullscreen grid page
Add a row of filter tabs (All, Image, Video, Audio, Documents,
Data & Files) at the top of the fullscreen tool grid. Selecting a
tab filters the visible tools by modality, and the existing search
still works within the filtered set.

Also registers the Wand2 icon needed by the new video-effects
category header.
2026-06-13 14:45:16 +08:00
SnapOtter 492da820f8 fix(web): resolve feature install status sync and mutual exclusivity (#214) 2026-06-13 13:44:37 +08:00
SnapOtter 51666cdd5f feat(tools): 2.0 phase 5 wave 5b - ai pool: ocr-pdf, transcription, background composites (5 tools) (#226) 2026-06-13 10:19:47 +08:00
SnapOtter 6e1b9865f1 feat(tools): 2.0 phase 5 wave 5a - image gap-fill (11 tools) (#225) 2026-06-13 10:19:16 +08:00
SnapOtter fc7c1f850e feat(tools): 2.0 phase 5 wave 4 - office, ebooks, data, archives (14 tools) (#224) 2026-06-13 10:19:11 +08:00
SnapOtter 638288e196 feat(tools): 2.0 phase 5 wave 3b - audio depth (14 tools) (#222) 2026-06-13 10:19:06 +08:00