- Add LICENSE (GNU Affero General Public License v3.0)
- Add NOTICE file with SearXNG attribution for borrowed scraping patterns
in google.py (arc_id, GSA user-agent, HTML selectors) and bing.py
(PERE pagination, base64 redirect decoding, CAPTCHA detection)
- Add CONTRIBUTING.md with contribution guidelines and license info
- Add SPDX-License-Identifier headers to all Python source files
- Add AGPL-3.0 license badge and License section to README.md
SearXNG is licensed under AGPL-3.0-or-later; this project follows suit
as it incorporates techniques derived from SearXNG's search engines.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add LICENSE (GNU Affero General Public License v3.0)
- Add NOTICE file with SearXNG attribution for borrowed scraping patterns
in google.py (arc_id, GSA user-agent, HTML selectors) and bing.py
(PERE pagination, base64 redirect decoding, CAPTCHA detection)
- Add CONTRIBUTING.md with contribution guidelines and license info
- Add SPDX-License-Identifier headers to all Python source files
- Add AGPL-3.0 license badge and License section to README.md
SearXNG is licensed under AGPL-3.0-or-later; this project follows suit
as it incorporates techniques derived from SearXNG's search engines.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Vite dev server: proxy /search to backend with path rewrite to /api/search
- FastAPI: add GET+POST /search route that 307-redirects to /api/search
(307 preserves the original HTTP method, so POST stays POST)
- Fixes 404 for clients calling /search instead of /api/search
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Bookmark icon on every web and image search result card
- Bookmark toggle in image lightbox viewer
- Dedicated /bookmarks page with All/Web/Images filter tabs
- Web bookmarks as cards, image bookmarks in masonry grid
- Full CRUD API: GET/POST /api/bookmarks, DELETE by id/url
- SQLite persistence in shared database
- Links in homepage footer and results page footer
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Save original Unsplash/Picsum URL as .url sidecar file alongside each image
- Track source_url in API responses (BackgroundResponse, BackgroundListItem)
- Homepage footer shows 'Image source' link when background is active
- Gallery shows 'Source' link on hover overlay for each image
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Fetch random nature/landscape image from Unsplash (picsum fallback)
- Auto-refresh with configurable interval (1 min to 1 day, default 30 min)
- Save every downloaded image to DATA_DIR/backgrounds/ for history
- New 'Background' tab in Settings: enable/disable toggle + refresh presets
- 'New image' button on homepage to manually fetch fresh background
- /backgrounds gallery page with masonry layout and lazy loading
- Background settings (bg_enabled, bg_refresh_minutes) persisted in SQLite
- Homepage adapts text colors when background is active
- Added backend/data/ to .gitignore, removed tracked DB file
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add width/height fields to ImageResult model
- Extract dimensions from DuckDuckGo and Bing engine responses
- Show size (e.g. 1920×1080) on card hover overlay and in lightbox details
- Prevent horizontal scrolling/panning on mobile (overflow-x: hidden + overscroll-behavior)
- Allow pinch-to-zoom via viewport meta (user-scalable=yes, maximum-scale=5)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- DB path now uses DATA_DIR env var (defaults to backend/data/ for local dev)
- Dockerfile sets DATA_DIR=/app/data with VOLUME declaration
- Docker run examples show -v mount for persistence across restarts
- /app/data stores SQLite DB (engines, excluded domains, cache settings)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add redis_url to SQLite settings table (persisted across restarts)
- On startup, prefer DB-stored URL over REDIS_URL env var
- Add reconnect_redis() to support live URL changes without restart
- Settings API now accepts/returns redis_url field
- Cache tab shows editable URL input with save button and connection status
- Immediate feedback: shows Connected/Disconnected after save
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add 'cached' boolean field to SearchResponse model
- Set cached=True when returning Redis-cached results
- Display green 'cached' pill with database icon in stats header
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
OpenAPI schema now derives the server URL from the incoming request
(Host header + X-Forwarded-Proto/X-Forwarded-Host for reverse proxies).
Curl examples in API docs use $BASE_URL placeholder which is replaced
at serve-time with the actual origin, so docs work correctly behind
nginx or any reverse proxy with a custom domain.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
P0 fixes:
- Image result cards are now real <a> links (open-in-new-tab, Cmd-click, copy-link)
- aria-label on all icon-only buttons (settings, clear, close, nav, toggles, delete)
- Search input semantics: label, name=q, type=search, combobox ARIA pattern
- Visible focus-visible ring on all interactive elements, removed bare outline-none
P1 fixes:
- Skip to main content link for keyboard navigation
- Proper heading hierarchy (h1/h2) and landmark elements (nav, main, aside)
- aria-live regions for loading/results/error announcements
- Custom favicon SVG (eliminates 404 console errors)
- Dialog/modal semantics with role=dialog and aria-modal
P2 API improvements:
- result_id, rank, engine on every result; timestamp, total_results, has_next on response
- Standardized APIError model (code/message/details/retry_hint) on all error responses
- X-Response-Time-Ms and rate-limit headers on all responses
- curl examples and sample JSON in OpenAPI docs for every endpoint
- Global exception handler returns consistent error JSON
- engines parameter in URL for reproducible sessions
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>