net-sift 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. net_sift-0.1.0/.editorconfig +14 -0
  2. net_sift-0.1.0/.gitattributes +4 -0
  3. net_sift-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +30 -0
  4. net_sift-0.1.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. net_sift-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +18 -0
  6. net_sift-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  7. net_sift-0.1.0/.github/dependabot.yml +10 -0
  8. net_sift-0.1.0/.github/workflows/ci.yml +41 -0
  9. net_sift-0.1.0/.github/workflows/codeql.yml +23 -0
  10. net_sift-0.1.0/.github/workflows/release.yml +42 -0
  11. net_sift-0.1.0/.gitignore +24 -0
  12. net_sift-0.1.0/.pre-commit-config.yaml +15 -0
  13. net_sift-0.1.0/CHANGELOG.md +29 -0
  14. net_sift-0.1.0/CODE_OF_CONDUCT.md +34 -0
  15. net_sift-0.1.0/CONTRIBUTING.md +41 -0
  16. net_sift-0.1.0/LICENSE +21 -0
  17. net_sift-0.1.0/NOTICE +14 -0
  18. net_sift-0.1.0/PKG-INFO +228 -0
  19. net_sift-0.1.0/README.md +193 -0
  20. net_sift-0.1.0/SECURITY.md +23 -0
  21. net_sift-0.1.0/docs/architecture.md +47 -0
  22. net_sift-0.1.0/net_sift/__init__.py +3 -0
  23. net_sift-0.1.0/net_sift/access/__init__.py +2 -0
  24. net_sift-0.1.0/net_sift/access/opencli.py +320 -0
  25. net_sift-0.1.0/net_sift/cli.py +159 -0
  26. net_sift-0.1.0/net_sift/config.py +25 -0
  27. net_sift-0.1.0/net_sift/doctor.py +100 -0
  28. net_sift-0.1.0/net_sift/engine/__init__.py +1 -0
  29. net_sift-0.1.0/net_sift/engine/core.py +235 -0
  30. net_sift-0.1.0/net_sift/engine/ranking.py +261 -0
  31. net_sift-0.1.0/net_sift/engine/sources.py +470 -0
  32. net_sift-0.1.0/net_sift/guides/setup-opencli.md +49 -0
  33. net_sift-0.1.0/net_sift/guides/sources.md +39 -0
  34. net_sift-0.1.0/net_sift/mcp_server.py +109 -0
  35. net_sift-0.1.0/net_sift/py.typed +0 -0
  36. net_sift-0.1.0/net_sift/search.py +115 -0
  37. net_sift-0.1.0/net_sift/sessions.py +120 -0
  38. net_sift-0.1.0/net_sift/skill/SKILL.md +40 -0
  39. net_sift-0.1.0/net_sift/status.py +27 -0
  40. net_sift-0.1.0/pyproject.toml +70 -0
  41. net_sift-0.1.0/tests/__init__.py +0 -0
  42. net_sift-0.1.0/tests/test_cli_install.py +39 -0
  43. net_sift-0.1.0/tests/test_doctor.py +18 -0
  44. net_sift-0.1.0/tests/test_engine_core.py +57 -0
  45. net_sift-0.1.0/tests/test_opencli.py +55 -0
  46. net_sift-0.1.0/tests/test_ranking.py +25 -0
  47. net_sift-0.1.0/tests/test_sessions.py +38 -0
@@ -0,0 +1,14 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ trim_trailing_whitespace = true
8
+ indent_style = space
9
+
10
+ [*.py]
11
+ indent_size = 4
12
+
13
+ [*.{md,yml,yaml,toml,json}]
14
+ indent_size = 2
@@ -0,0 +1,4 @@
1
+ * text=auto eol=lf
2
+ *.png binary
3
+ *.jpg binary
4
+ *.gif binary
@@ -0,0 +1,30 @@
1
+ name: Bug report
2
+ description: Report a problem with Net-Sift
3
+ labels: [bug]
4
+ body:
5
+ - type: textarea
6
+ id: what
7
+ attributes:
8
+ label: What happened
9
+ description: What you did and what went wrong.
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: expected
14
+ attributes:
15
+ label: What you expected
16
+ validations:
17
+ required: true
18
+ - type: textarea
19
+ id: doctor
20
+ attributes:
21
+ label: net-sift doctor output
22
+ description: Paste the output of `net-sift doctor`. Remove anything sensitive.
23
+ render: text
24
+ - type: input
25
+ id: version
26
+ attributes:
27
+ label: Version
28
+ description: Output of `net-sift --version`, plus OS and Python version.
29
+ validations:
30
+ required: true
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Security report
4
+ url: https://github.com/ali-rajabpour/Net-Sift/security/advisories/new
5
+ about: Please report vulnerabilities privately, not as a public issue.
@@ -0,0 +1,18 @@
1
+ name: Feature request
2
+ description: Suggest an idea or a new source for Net-Sift
3
+ labels: [enhancement]
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: Problem
9
+ description: What are you trying to do that Net-Sift does not support yet?
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: proposal
14
+ attributes:
15
+ label: Proposal
16
+ description: What should it do? For a new source, link its public API or access method.
17
+ validations:
18
+ required: true
@@ -0,0 +1,12 @@
1
+ ## Summary
2
+
3
+ <!-- What does this change and why. -->
4
+
5
+ ## Checklist
6
+
7
+ - [ ] `ruff check net_sift tests` passes
8
+ - [ ] `ruff format --check net_sift tests` passes
9
+ - [ ] `pytest` passes
10
+ - [ ] Tests added or updated for the change (no network in tests)
11
+ - [ ] `CHANGELOG.md` updated under "Unreleased"
12
+ - [ ] Change stays within scope: read-only research, no posting, no auth bypass
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: pip
4
+ directory: "/"
5
+ schedule:
6
+ interval: weekly
7
+ - package-ecosystem: github-actions
8
+ directory: "/"
9
+ schedule:
10
+ interval: weekly
@@ -0,0 +1,41 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ group: ci-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ test:
18
+ runs-on: ${{ matrix.os }}
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ os: [ubuntu-latest]
23
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
24
+ include:
25
+ - os: macos-latest
26
+ python-version: "3.12"
27
+ steps:
28
+ - uses: actions/checkout@v4
29
+ - uses: actions/setup-python@v5
30
+ with:
31
+ python-version: ${{ matrix.python-version }}
32
+ - name: Install
33
+ run: |
34
+ python -m pip install --upgrade pip
35
+ pip install -e ".[dev]"
36
+ - name: Lint
37
+ run: ruff check net_sift tests
38
+ - name: Format check
39
+ run: ruff format --check net_sift tests
40
+ - name: Test
41
+ run: pytest --cov=net_sift --cov-report=term-missing
@@ -0,0 +1,23 @@
1
+ name: CodeQL
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ schedule:
9
+ - cron: "27 3 * * 1"
10
+
11
+ permissions:
12
+ contents: read
13
+ security-events: write
14
+
15
+ jobs:
16
+ analyze:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+ - uses: github/codeql-action/init@v3
21
+ with:
22
+ languages: python
23
+ - uses: github/codeql-action/analyze@v3
@@ -0,0 +1,42 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: write
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: actions/setup-python@v5
16
+ with:
17
+ python-version: "3.12"
18
+ - name: Build
19
+ run: |
20
+ python -m pip install --upgrade pip build
21
+ python -m build
22
+ - name: Create release
23
+ uses: softprops/action-gh-release@v2
24
+ with:
25
+ files: dist/*
26
+ generate_release_notes: true
27
+
28
+ publish:
29
+ needs: build
30
+ runs-on: ubuntu-latest
31
+ environment: pypi
32
+ permissions:
33
+ id-token: write
34
+ steps:
35
+ - uses: actions/checkout@v4
36
+ - uses: actions/setup-python@v5
37
+ with:
38
+ python-version: "3.12"
39
+ - run: |
40
+ python -m pip install --upgrade pip build
41
+ python -m build
42
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,24 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .eggs/
6
+ build/
7
+ dist/
8
+ .venv/
9
+ venv/
10
+
11
+ # net-sift runtime: search sessions are user data, never committed
12
+ .net-sift/
13
+ sessions/
14
+
15
+ # local env / secrets
16
+ .env
17
+ .env.*
18
+ !.env.example
19
+
20
+ # session handoffs (local memory, never committed)
21
+ .claude/handoffs/
22
+
23
+ # OS
24
+ .DS_Store
@@ -0,0 +1,15 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.6.9
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix]
7
+ - id: ruff-format
8
+ - repo: https://github.com/pre-commit/pre-commit-hooks
9
+ rev: v5.0.0
10
+ hooks:
11
+ - id: end-of-file-fixer
12
+ - id: trailing-whitespace
13
+ - id: check-yaml
14
+ - id: check-toml
15
+ - id: check-added-large-files
@@ -0,0 +1,29 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here. The format is based on
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres
5
+ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.1.0] - 2026-10-01
10
+
11
+ ### Added
12
+
13
+ - Coverage-first search engine: keyless sources (Bluesky, Hacker News, GitHub,
14
+ arXiv, Polymarket, StockTwits, Mastodon, Habr, V2EX, Telegram, Sogou WeChat),
15
+ a window-bisecting gap-closing driver, per-source near-duplicate dedup, and
16
+ relevance ranking with head-entity grounding, CJK segmentation, a recency boost,
17
+ and engagement weighting.
18
+ - Walled-platform access (Twitter/X, Reddit, Instagram, Facebook, Bilibili,
19
+ Xiaohongshu) through the user's logged-in Chromium browser via OpenCLI, with
20
+ runtime adapter discovery.
21
+ - MCP server exposing `deep_search`, `resume`, `list_sessions`, `cleanup`,
22
+ `doctor`, `status`, and `fetch`, all context-lean.
23
+ - Session storage under `~/.net-sift/sessions/` with keep-or-delete confirmation.
24
+ - `net-sift` CLI: `install`, `serve`, `doctor`, `status`, `search`.
25
+ - Installer that registers the MCP server and status bar for Claude Code and Codex.
26
+ - Test suite, Ruff linting, and GitHub Actions CI.
27
+
28
+ [Unreleased]: https://github.com/ali-rajabpour/Net-Sift/compare/v0.1.0...HEAD
29
+ [0.1.0]: https://github.com/ali-rajabpour/Net-Sift/releases/tag/v0.1.0
@@ -0,0 +1,34 @@
1
+ # Code of Conduct
2
+
3
+ ## Our pledge
4
+
5
+ We as members, contributors, and maintainers pledge to make participation in this
6
+ project a harassment-free experience for everyone, regardless of age, body size,
7
+ visible or invisible disability, ethnicity, sex characteristics, gender identity
8
+ and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, religion, or sexual identity and
10
+ orientation.
11
+
12
+ ## Our standards
13
+
14
+ Examples of behavior that contributes to a positive environment:
15
+
16
+ - Showing empathy and kindness toward other people
17
+ - Being respectful of differing opinions, viewpoints, and experiences
18
+ - Giving and gracefully accepting constructive feedback
19
+ - Accepting responsibility and apologizing to those affected by our mistakes
20
+
21
+ Unacceptable behavior includes harassment, insulting or derogatory comments,
22
+ public or private harassment, and publishing others' private information without
23
+ permission.
24
+
25
+ ## Enforcement
26
+
27
+ Instances of abusive or unacceptable behavior may be reported to the maintainers
28
+ through a private GitHub security advisory or by contacting the repository owner.
29
+ All complaints will be reviewed and investigated promptly and fairly.
30
+
31
+ ## Attribution
32
+
33
+ This Code of Conduct is adapted from the Contributor Covenant, version 2.1,
34
+ available at https://www.contributor-covenant.org/version/2/1/code_of_conduct/.
@@ -0,0 +1,41 @@
1
+ # Contributing
2
+
3
+ Thanks for your interest in Net-Sift.
4
+
5
+ ## Development setup
6
+
7
+ ```bash
8
+ git clone https://github.com/ali-rajabpour/Net-Sift.git
9
+ cd Net-Sift
10
+ python -m venv .venv && source .venv/bin/activate
11
+ pip install -e ".[dev]"
12
+ ```
13
+
14
+ ## Before you open a pull request
15
+
16
+ ```bash
17
+ ruff check net_sift tests # lint
18
+ ruff format net_sift tests # format
19
+ pytest # tests
20
+ ```
21
+
22
+ - Keep the engine dependency-light. New third-party dependencies need a clear
23
+ reason.
24
+ - Add a test for any non-trivial logic. Tests must not hit the network; use
25
+ fixtures and temp paths.
26
+ - Each source is a callable `(query, since, until, budget) -> (records, ceiling)`.
27
+ Follow that contract and emit the record shape from `net_sift.engine.core.rec`.
28
+ - Update `CHANGELOG.md` under "Unreleased".
29
+
30
+ ## Scope
31
+
32
+ Net-Sift fetches and ranks public content for research. It does not post, comment,
33
+ or perform any write action on any platform, and it does not bypass authentication.
34
+ Keep contributions within that scope.
35
+
36
+ ## Adding a source
37
+
38
+ - Keyless source: add it to `net_sift/engine/sources.py` and register it in
39
+ `SOURCES`.
40
+ - Walled platform: it is reached through OpenCLI. If OpenCLI gains an adapter,
41
+ add the site to `WALLED_SITES` in `net_sift/access/opencli.py`.
net_sift-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ali Rajabpour
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
net_sift-0.1.0/NOTICE ADDED
@@ -0,0 +1,14 @@
1
+ Net-Sift
2
+ Copyright (c) 2026 Ali Rajabpour
3
+
4
+ This product includes code adapted from Agent Reach
5
+ (https://github.com/Panniantong/Agent-Reach), licensed under the MIT License,
6
+ Copyright (c) Panniantong.
7
+
8
+ Portions adapted from Agent Reach:
9
+ - net_sift/access/opencli.py (OpenCLI real-browser backend probing)
10
+ - net_sift/doctor.py (source health-check scaffolding)
11
+ - net_sift/guides/*.md (per-platform setup guides)
12
+
13
+ OpenCLI itself (https://github.com/jackwener/opencli) is a separate project by
14
+ its own authors and is invoked as an external tool, not vendored here.
@@ -0,0 +1,228 @@
1
+ Metadata-Version: 2.5
2
+ Name: net-sift
3
+ Version: 0.1.0
4
+ Summary: Coverage-first social and web deep-search as an MCP server: exhaustive multi-source sweeps, smart ranking, and honest gap accounting, with walled platforms reached through your logged-in Chromium browser.
5
+ Project-URL: Homepage, https://github.com/ali-rajabpour/Net-Sift
6
+ Project-URL: Repository, https://github.com/ali-rajabpour/Net-Sift.git
7
+ Author: Ali Rajabpour
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ License-File: NOTICE
11
+ Keywords: deep-search,mcp,opencli,osint,research,social-search
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: Information Technology
16
+ Classifier: Operating System :: MacOS
17
+ Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Topic :: Internet
24
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
25
+ Classifier: Typing :: Typed
26
+ Requires-Python: >=3.10
27
+ Requires-Dist: defusedxml>=0.7.1
28
+ Requires-Dist: mcp>=2.2.0
29
+ Provides-Extra: dev
30
+ Requires-Dist: mypy>=1.11; extra == 'dev'
31
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
32
+ Requires-Dist: pytest>=8.0; extra == 'dev'
33
+ Requires-Dist: ruff>=0.6; extra == 'dev'
34
+ Description-Content-Type: text/markdown
35
+
36
+ # Net-Sift
37
+
38
+ Coverage-first social and web deep-search, delivered as an MCP server.
39
+
40
+ [![CI](https://github.com/ali-rajabpour/Net-Sift/actions/workflows/ci.yml/badge.svg)](https://github.com/ali-rajabpour/Net-Sift/actions/workflows/ci.yml)
41
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
42
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-green.svg)](https://www.python.org/)
43
+ [![Linting: Ruff](https://img.shields.io/badge/lint-ruff-261230.svg)](https://github.com/astral-sh/ruff)
44
+
45
+ Net-Sift sweeps many sources for everything being said about a topic, ranks it,
46
+ removes duplicates, and reports what it could not reach. The gap report is part of
47
+ the answer, not an afterthought. Login-walled platforms are reached through your
48
+ own logged-in Chromium browser, so there is no cookie copying and no private-API
49
+ reverse engineering.
50
+
51
+ ## Table of contents
52
+
53
+ - [Why Net-Sift](#why-net-sift)
54
+ - [Features](#features)
55
+ - [How it works](#how-it-works)
56
+ - [Install](#install)
57
+ - [Quickstart](#quickstart)
58
+ - [Walled platforms](#walled-platforms)
59
+ - [Sources](#sources)
60
+ - [MCP tools](#mcp-tools)
61
+ - [Configuration](#configuration)
62
+ - [Sessions and privacy](#sessions-and-privacy)
63
+ - [Development](#development)
64
+ - [Contributing](#contributing)
65
+ - [Security](#security)
66
+ - [License](#license)
67
+ - [Acknowledgements](#acknowledgements)
68
+
69
+ ## Why Net-Sift
70
+
71
+ Most research tools return a handful of links or a synthesized answer. Net-Sift
72
+ returns a corpus with an explicit account of coverage: what was retrieved, what hit
73
+ a ceiling, and what was out of reach. It is built for topic surveys, sentiment
74
+ sweeps, competitor and discourse monitoring, and literature-style scans where a
75
+ single search would under-serve the answer.
76
+
77
+ ## Features
78
+
79
+ - Many sources in one sweep, keyless by default (Bluesky, Hacker News, GitHub,
80
+ arXiv, Polymarket, StockTwits, Mastodon, and more).
81
+ - Walled platforms (Twitter/X, Reddit, Instagram, Facebook, Bilibili, Xiaohongshu)
82
+ through your logged-in Chromium browser via OpenCLI.
83
+ - Relevance ranking with head-entity grounding, CJK-aware tokenization, a recency
84
+ boost, and engagement weighting.
85
+ - A gap-closing driver that bisects the time window to recover tails a source
86
+ would otherwise hide.
87
+ - Per-source near-duplicate collapse, so repeats do not inflate the corpus while
88
+ cross-platform coverage is preserved.
89
+ - Context-lean by design: the agent receives summaries, coverage, gaps, and the
90
+ top results, never the raw corpus.
91
+ - Saved sessions you can continue later, deleted only on your confirmation.
92
+
93
+ ## How it works
94
+
95
+ ```
96
+ query
97
+ |
98
+ v
99
+ sources (keyless) access (walled, via OpenCLI + your browser)
100
+ \_________________ _________________/
101
+ \/
102
+ gap-closing driver (bisect on ceiling)
103
+ |
104
+ dedup + ranking
105
+ |
106
+ session on disk ---> summary + coverage + gaps ---> agent
107
+ ```
108
+
109
+ Keyless sources call public endpoints directly. Walled platforms are reached by
110
+ shelling to `opencli <site> <command>` against your logged-in browser. Results are
111
+ normalized to one record shape, deduplicated, ranked, and written to a session.
112
+ Only the summary returns to the caller.
113
+
114
+ ## Install
115
+
116
+ Install from source (not yet on PyPI):
117
+
118
+ ```bash
119
+ uv tool install git+https://github.com/ali-rajabpour/Net-Sift.git
120
+ # or: pipx install git+https://github.com/ali-rajabpour/Net-Sift.git
121
+ ```
122
+
123
+ Then register it with your clients:
124
+
125
+ ```bash
126
+ net-sift install # register the MCP + status bar, check deps, run doctor
127
+ ```
128
+
129
+ `net-sift install` registers the MCP server and a status bar with Claude Code and
130
+ Codex, checks for Node and OpenCLI, and runs the doctor. Restart your client
131
+ afterward so it picks up the server.
132
+
133
+ ## Quickstart
134
+
135
+ ```bash
136
+ net-sift doctor # what can be reached right now
137
+ net-sift search "topic" --platforms github,arxiv --max 50
138
+ ```
139
+
140
+ In an MCP client, call `deep_search`:
141
+
142
+ ```
143
+ deep_search(query="post-quantum cryptography adoption", since="2026-01-01")
144
+ ```
145
+
146
+ You get a summary with per-source counts, a coverage map, the gap list, the top
147
+ ranked items, and the corpus path.
148
+
149
+ ## Walled platforms
150
+
151
+ Twitter/X, Reddit, Instagram, Facebook, Bilibili, and Xiaohongshu need a logged-in
152
+ Chromium browser and OpenCLI. See [net_sift/guides/setup-opencli.md](net_sift/guides/setup-opencli.md).
153
+ Short version:
154
+
155
+ 1. Install Node 20.18.1+ and `@jackwener/opencli` (or OpenCLIApp).
156
+ 2. Use a Chromium browser (Chrome, Edge, Brave, Arc, Comet, and so on) with the
157
+ OpenCLI Browser Bridge extension. Safari and Firefox cannot load it.
158
+ 3. Log into the platforms you want in that browser.
159
+ 4. Run `net-sift doctor` to confirm.
160
+
161
+ Desktop only. There is no headless or server path for walled platforms.
162
+
163
+ ## Sources
164
+
165
+ Full table in [net_sift/guides/sources.md](net_sift/guides/sources.md). Keyless
166
+ sources are on by default; walled sources appear once OpenCLI is connected.
167
+
168
+ ## MCP tools
169
+
170
+ | Tool | Purpose |
171
+ |------|---------|
172
+ | `deep_search` | run a sweep, return a summary and the corpus path |
173
+ | `resume` | continue an earlier search |
174
+ | `list_sessions` | list saved searches |
175
+ | `cleanup` | delete a saved search (after user confirmation) |
176
+ | `doctor` | what is reachable and how to connect walled platforms |
177
+ | `status` | compact connectivity snapshot |
178
+ | `fetch` | readable text for one page |
179
+
180
+ ## Configuration
181
+
182
+ | Variable | Effect |
183
+ |----------|--------|
184
+ | `GITHUB_TOKEN` | higher GitHub Search API rate limit |
185
+ | `NET_SIFT_HOME` | session storage location (default `~/.net-sift`) |
186
+ | `NET_SIFT_OPENCLI_BIN` | path to the `opencli` binary if not on `PATH` |
187
+
188
+ All configuration is read from the environment. Net-Sift stores no credentials.
189
+
190
+ ## Sessions and privacy
191
+
192
+ Each search is written to `~/.net-sift/sessions/<id>/` as `corpus.jsonl` and
193
+ `meta.json`. Nothing is sent anywhere. After a search, Net-Sift reminds you the
194
+ corpus is kept so you can `resume` it, and deletes it only when you call `cleanup`.
195
+ Walled platforms use your own browser session; Net-Sift never reads or copies your
196
+ cookies.
197
+
198
+ ## Development
199
+
200
+ ```bash
201
+ git clone https://github.com/ali-rajabpour/Net-Sift.git
202
+ cd Net-Sift
203
+ python -m venv .venv && source .venv/bin/activate
204
+ pip install -e ".[dev]"
205
+ ruff check net_sift tests && pytest
206
+ ```
207
+
208
+ See [docs/architecture.md](docs/architecture.md) for the design.
209
+
210
+ ## Contributing
211
+
212
+ See [CONTRIBUTING.md](CONTRIBUTING.md). Net-Sift is read-only research: it does not
213
+ post, comment, or bypass authentication, and contributions stay within that scope.
214
+
215
+ ## Security
216
+
217
+ See [SECURITY.md](SECURITY.md). Report vulnerabilities privately through GitHub.
218
+
219
+ ## License
220
+
221
+ MIT. See [LICENSE](LICENSE). This project includes code adapted from
222
+ [Agent Reach](https://github.com/Panniantong/Agent-Reach) (MIT); see [NOTICE](NOTICE).
223
+
224
+ ## Acknowledgements
225
+
226
+ - [OpenCLI](https://github.com/jackwener/opencli) for logged-in browser access.
227
+ - [Agent Reach](https://github.com/Panniantong/Agent-Reach) for the onboarding and
228
+ doctor patterns.