[project] name = "searchts" version = "0.8.0" description = "The missing layer between AI and the web. Open-source escalating unlocker (browser-fingerprinted fetch -> JS-render relay -> stealth browser) for `read`, keyless multi-provider `search` with rank fusion, subtitles-first video `transcribe`, and on-demand asset/design-inspiration `grab` (palette/fonts/assets through the same unlocker). CLI + MCP server + Claude Code skill. Keyless by default; optional platform helpers." readme = "README.md" license = {text = "MIT"} requires-python = ">=3.10" authors = [{name = "capad", email = "oss@capad.fyi"}] keywords = [ "ai-agent", "llm-tools", "agent-infrastructure", "mcp", "web-reader", "web-unlocker", "unlocker", "anti-bot", "web-search", "ai-search", "rank-fusion", "video-transcription", "whisper", "assets", "design-inspiration", "web-scraper", "cli", "claude-code", "free", "no-api-key", "keyless", ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Internet :: WWW/HTTP", "Topic :: Scientific/Engineering :: Artificial Intelligence", ] dependencies = [ "requests>=2.28", "feedparser>=6.0", "python-dotenv>=1.0", "loguru>=0.7", "pyyaml>=6.0", "rich>=13.0", "yt-dlp>=2024.0", "curl_cffi>=0.7", "trafilatura>=1.8", "ddgs>=9.0", ] [project.optional-dependencies] browser = ["patchright>=1.50"] # tier-2 stealth-browser backend (undetected Playwright) cookies = ["browser-cookie3>=0.19"] # P2.3: SDK 2.x renamed FastMCP -> MCPServer. Cap below 3. mcp = ["mcp[cli]>=2,<3"] # MCPServer stdio (searchts mcp serve) local-transcribe = ["faster-whisper>=1.0"] # keyless local Whisper (searchts transcribe --provider local) all = ["patchright>=1.50", "mcp[cli]>=2,<3", "browser-cookie3>=0.19", "faster-whisper>=1.0"] dev = [ "pytest>=8.0", "ruff>=0.8", "mypy>=1.12", "types-requests>=2.32", "types-PyYAML>=6.0", ] [project.scripts] searchts = "searchts.cli:main" [project.urls] # Homepage points at the write-up rather than back at this repo, which the # Repository link already covers. It also closes the loop the other way: the # case study names the author, so the package, the site and the person resolve # to one another instead of three unconnected pages. Homepage = "https://capad.fyi/work/searchts" Repository = "https://github.com/capad-xyz/searchts" Issues = "https://github.com/capad-xyz/searchts/issues" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["searchts"] [tool.ruff] target-version = "py310" line-length = 100 [tool.ruff.lint] select = ["E", "F", "I"] ignore = ["E501"] [tool.mypy] python_version = "3.10" warn_unused_configs = true warn_redundant_casts = true warn_unused_ignores = true check_untyped_defs = true ignore_missing_imports = true exclude = ["^tests/"]