owlscan 1.2.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 (44) hide show
  1. owlscan-1.2.0/LICENSE +32 -0
  2. owlscan-1.2.0/PKG-INFO +440 -0
  3. owlscan-1.2.0/README.md +340 -0
  4. owlscan-1.2.0/owlscan/__init__.py +47 -0
  5. owlscan-1.2.0/owlscan/cli.py +339 -0
  6. owlscan-1.2.0/owlscan/core/__init__.py +0 -0
  7. owlscan-1.2.0/owlscan/core/config.py +244 -0
  8. owlscan-1.2.0/owlscan/core/database.py +83 -0
  9. owlscan-1.2.0/owlscan/core/engine.py +276 -0
  10. owlscan-1.2.0/owlscan/core/models.py +279 -0
  11. owlscan-1.2.0/owlscan/exporters/__init__.py +0 -0
  12. owlscan-1.2.0/owlscan/exporters/manager.py +528 -0
  13. owlscan-1.2.0/owlscan/intel/__init__.py +0 -0
  14. owlscan-1.2.0/owlscan/intel/apis/__init__.py +0 -0
  15. owlscan-1.2.0/owlscan/intel/apis/all_apis.py +1558 -0
  16. owlscan-1.2.0/owlscan/intel/apis/base.py +215 -0
  17. owlscan-1.2.0/owlscan/intel/apis/shodan_api.py +165 -0
  18. owlscan-1.2.0/owlscan/intel/orchestrator.py +130 -0
  19. owlscan-1.2.0/owlscan/intel/people/__init__.py +0 -0
  20. owlscan-1.2.0/owlscan/intel/people/aggregator.py +254 -0
  21. owlscan-1.2.0/owlscan/scrapers/__init__.py +0 -0
  22. owlscan-1.2.0/owlscan/scrapers/api_hunter.py +286 -0
  23. owlscan-1.2.0/owlscan/scrapers/crawler.py +366 -0
  24. owlscan-1.2.0/owlscan/scrapers/dns_recon.py +379 -0
  25. owlscan-1.2.0/owlscan/scrapers/port_scanner.py +267 -0
  26. owlscan-1.2.0/owlscan/scrapers/spiders/__init__.py +0 -0
  27. owlscan-1.2.0/owlscan/scrapers/tech_detector.py +447 -0
  28. owlscan-1.2.0/owlscan/web/__init__.py +0 -0
  29. owlscan-1.2.0/owlscan/web/app.py +134 -0
  30. owlscan-1.2.0/owlscan/web/routes/__init__.py +0 -0
  31. owlscan-1.2.0/owlscan/web/routes/api.py +106 -0
  32. owlscan-1.2.0/owlscan/web/routes/dashboard.py +48 -0
  33. owlscan-1.2.0/owlscan/web/routes/export.py +66 -0
  34. owlscan-1.2.0/owlscan/web/routes/intel.py +59 -0
  35. owlscan-1.2.0/owlscan/web/routes/scans.py +124 -0
  36. owlscan-1.2.0/owlscan/web/routes/settings.py +63 -0
  37. owlscan-1.2.0/owlscan.egg-info/PKG-INFO +440 -0
  38. owlscan-1.2.0/owlscan.egg-info/SOURCES.txt +42 -0
  39. owlscan-1.2.0/owlscan.egg-info/dependency_links.txt +1 -0
  40. owlscan-1.2.0/owlscan.egg-info/entry_points.txt +3 -0
  41. owlscan-1.2.0/owlscan.egg-info/requires.txt +63 -0
  42. owlscan-1.2.0/owlscan.egg-info/top_level.txt +1 -0
  43. owlscan-1.2.0/setup.cfg +4 -0
  44. owlscan-1.2.0/setup.py +51 -0
owlscan-1.2.0/LICENSE ADDED
@@ -0,0 +1,32 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 packetsn1ffer
4
+ Claude (Anthropic) — AI Architecture & Implementation
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
23
+
24
+ ---
25
+
26
+ NightOwl — Open Source OSINT Intelligence Framework
27
+ "The night sees all. The owl forgets nothing."
28
+
29
+ This software is intended for authorized security research, OSINT investigation,
30
+ and educational purposes only. Users are solely responsible for ensuring their
31
+ use complies with all applicable local, state, national, and international laws.
32
+ The authors assume no liability for misuse or damage caused by this software.
owlscan-1.2.0/PKG-INFO ADDED
@@ -0,0 +1,440 @@
1
+ Metadata-Version: 2.4
2
+ Name: owlscan
3
+ Version: 1.2.0
4
+ Summary: OwlScan :: Open-Source OSINT Intelligence Framework
5
+ Home-page: https://github.com/owlscan/owlscan
6
+ Author: packetsn1ffer
7
+ Project-URL: Bug Reports, https://github.com/owlscan/owlscan/issues
8
+ Project-URL: Source, https://github.com/owlscan/owlscan
9
+ Keywords: osint intelligence reconnaissance security pentest
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Environment :: Web Environment
12
+ Classifier: Intended Audience :: Information Technology
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Security
21
+ Classifier: Topic :: Internet :: WWW/HTTP :: Indexing/Search
22
+ Classifier: Topic :: System :: Networking :: Monitoring
23
+ Requires-Python: >=3.10
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: flask>=3.0.0
27
+ Requires-Dist: flask-socketio>=5.3.6
28
+ Requires-Dist: flask-sqlalchemy>=3.1.0
29
+ Requires-Dist: flask-login>=0.6.3
30
+ Requires-Dist: flask-wtf>=1.2.1
31
+ Requires-Dist: eventlet>=0.35.0
32
+ Requires-Dist: sqlalchemy>=2.0.0
33
+ Requires-Dist: alembic>=1.13.0
34
+ Requires-Dist: scrapy>=2.11.0
35
+ Requires-Dist: scrapy-splash>=0.9.0
36
+ Requires-Dist: scrapy-rotating-proxies>=0.6.2
37
+ Requires-Dist: scrapy-user-agents>=0.1.1
38
+ Requires-Dist: playwright>=1.40.0
39
+ Requires-Dist: httpx[asyncio]>=0.26.0
40
+ Requires-Dist: aiohttp>=3.9.0
41
+ Requires-Dist: requests>=2.31.0
42
+ Requires-Dist: urllib3>=2.1.0
43
+ Requires-Dist: shodan>=1.31.0
44
+ Requires-Dist: censys>=2.2.0
45
+ Requires-Dist: OTXv2>=1.5.12
46
+ Requires-Dist: dnspython>=2.4.0
47
+ Requires-Dist: python-whois>=0.9.4
48
+ Requires-Dist: ipwhois>=1.2.0
49
+ Requires-Dist: scapy>=2.5.0
50
+ Requires-Dist: cryptography>=42.0.0
51
+ Requires-Dist: bcrypt>=4.1.0
52
+ Requires-Dist: pyotp>=2.9.0
53
+ Requires-Dist: pydantic>=2.5.0
54
+ Requires-Dist: pandas>=2.1.0
55
+ Requires-Dist: numpy>=1.26.0
56
+ Requires-Dist: click>=8.1.0
57
+ Requires-Dist: rich>=13.7.0
58
+ Requires-Dist: typer>=0.9.0
59
+ Requires-Dist: reportlab>=4.0.8
60
+ Requires-Dist: openpyxl>=3.1.2
61
+ Requires-Dist: lxml>=5.0.0
62
+ Requires-Dist: stix2>=3.0.1
63
+ Requires-Dist: jinja2>=3.1.2
64
+ Requires-Dist: weasyprint>=61.0
65
+ Requires-Dist: python-dotenv>=1.0.0
66
+ Requires-Dist: pyyaml>=6.0.1
67
+ Requires-Dist: aiofiles>=23.2.1
68
+ Requires-Dist: python-dateutil>=2.8.2
69
+ Requires-Dist: humanize>=4.9.0
70
+ Requires-Dist: tldextract>=5.1.1
71
+ Requires-Dist: ua-parser>=0.18.0
72
+ Requires-Dist: user-agents>=2.2.0
73
+ Requires-Dist: fake-useragent>=1.4.0
74
+ Requires-Dist: geoip2>=4.8.0
75
+ Requires-Dist: geopy>=2.4.1
76
+ Requires-Dist: Pillow>=10.2.0
77
+ Requires-Dist: pytesseract>=0.3.10
78
+ Requires-Dist: aiofiles>=23.2.1
79
+ Requires-Dist: aiodns>=3.1.1
80
+ Requires-Dist: matplotlib>=3.8.0
81
+ Requires-Dist: pytest>=7.4.0
82
+ Requires-Dist: pytest-asyncio>=0.23.0
83
+ Requires-Dist: pytest-cov>=4.1.0
84
+ Requires-Dist: black>=23.12.0
85
+ Requires-Dist: isort>=5.13.2
86
+ Requires-Dist: flake8>=7.0.0
87
+ Requires-Dist: mypy>=1.8.0
88
+ Requires-Dist: pre-commit>=3.6.0
89
+ Dynamic: author
90
+ Dynamic: classifier
91
+ Dynamic: description
92
+ Dynamic: description-content-type
93
+ Dynamic: home-page
94
+ Dynamic: keywords
95
+ Dynamic: license-file
96
+ Dynamic: project-url
97
+ Dynamic: requires-dist
98
+ Dynamic: requires-python
99
+ Dynamic: summary
100
+
101
+ # 🦉 OwlScan // PHANTOM SIGNAL
102
+
103
+ ```
104
+ ██████╗ ██╗ ██╗██╗ ███████╗ ██████╗ █████╗ ███╗ ██╗
105
+ ██╔═══██╗██║ ██║██║ ██╔════╝██╔════╝██╔══██╗████╗ ██║
106
+ ██║ ██║██║ █╗ ██║██║ ███████╗██║ ███████║██╔██╗ ██║
107
+ ██║ ██║██║███╗██║██║ ╚════██║██║ ██╔══██║██║╚██╗██║
108
+ ╚██████╔╝╚███╔███╔╝███████╗███████║╚██████╗██║ ██║██║ ╚████║
109
+ ╚═════╝ ╚══╝╚══╝ ╚══════╝╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═══╝
110
+ >> OPEN-SOURCE OSINT INTELLIGENCE FRAMEWORK <<
111
+ "See everything. Leave no trace."
112
+ ```
113
+
114
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-00ff41?style=flat-square&logo=python)](https://python.org)
115
+ [![License: MIT](https://img.shields.io/badge/license-MIT-00f3ff?style=flat-square)](LICENSE)
116
+ [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows%20%7C%20Docker-b026ff?style=flat-square)]()
117
+ [![GitHub Stars](https://img.shields.io/github/stars/owlscan/owlscan?style=flat-square&color=00ff41)](https://github.com/owlscan/owlscan/stargazers)
118
+ [![Open Issues](https://img.shields.io/github/issues/owlscan/owlscan?style=flat-square&color=b026ff)](https://github.com/owlscan/owlscan/issues)
119
+ [![CI](https://img.shields.io/github/actions/workflow/status/owlscan/owlscan/ci.yml?branch=main&style=flat-square&label=CI&color=00ff41)](https://github.com/owlscan/owlscan/actions/workflows/ci.yml)
120
+ [![Project Site](https://img.shields.io/badge/site-owlscan-00f3ff?style=flat-square&logo=github)](https://owlscan.sh)
121
+ [![Changelog](https://img.shields.io/badge/changelog-view-00ff41?style=flat-square)](CHANGELOG.md)
122
+
123
+
124
+ ---
125
+
126
+ ## 🎬 Demo
127
+
128
+ ### CLI — Ghost Run in action
129
+
130
+ ![CLI scan demo](docs/assets/demo.gif)
131
+
132
+ ### Web UI — Shadow Grid (Dashboard)
133
+
134
+ ![Dashboard](docs/assets/screenshot_dashboard.svg)
135
+
136
+ ### Web UI — Launch Ghost Run
137
+
138
+ ![Launch Ghost Run](docs/assets/screenshot_launch.svg)
139
+
140
+ ### Web UI — Scan Results
141
+
142
+ ![Scan results](docs/assets/screenshot_results.svg)
143
+
144
+ ### Web UI — Theme Options
145
+
146
+ OwlScan ships with two built-in UI themes, selectable via the **☀/🌙 toggle** in the top navigation bar. Your preference is saved automatically and persists across sessions.
147
+
148
+ | Theme | Description |
149
+ |-------|-------------|
150
+ | **Dark** *(default)* | Cyberpunk aesthetic — deep charcoal background, neon green/cyan/purple accents, matrix rain canvas, glowing owl logo |
151
+ | **Light** | "Phantom Dawn" — soft blue-grey background, muted accent palette, clean black ASCII logo, matrix rain disabled |
152
+
153
+ > **Asciinema recording:** Watch the full interactive demo on asciinema.org, or play it locally:
154
+ > ```bash
155
+ > pip install asciinema
156
+ > asciinema play docs/assets/demo.cast
157
+ > ```
158
+
159
+ [![asciicast](https://asciinema.org/a/QHiA1uk3kf9pKxY6.svg)](https://asciinema.org/a/QHiA1uk3kf9pKxY6)
160
+
161
+ ---
162
+
163
+ ## ⚡ What is OwlScan?
164
+
165
+ OwlScan is a **community-powered, open-source OSINT intelligence framework** built for security researchers, penetration testers, investigators, and enthusiasts. It combines web scraping, network reconnaissance, people intelligence aggregation, and threat analysis into a single cohesive platform.
166
+
167
+ > **LEGAL DISCLAIMER:** OwlScan is for **authorized security research, OSINT investigations, and educational purposes only**. Only scan targets you have explicit permission to test. You are solely responsible for compliance with all applicable laws. The developers assume NO liability for misuse.
168
+
169
+ ---
170
+
171
+ ## 🔥 Features
172
+
173
+ ### 🕷 Web Reconnaissance
174
+ - **Scrapy-powered** deep web crawler with JavaScript rendering support
175
+ - **Technology detection** — fingerprints 50+ technologies (CMS, frameworks, CDNs, WAFs)
176
+ - **API endpoint hunter** — discovers REST APIs, GraphQL, Swagger docs, admin panels, `.env` leaks
177
+ - **Security header analysis** with graded posture scoring
178
+ - **Email, phone, link, and comment harvesting**
179
+
180
+ ### 🌐 Network Intelligence
181
+ - **Async port scanner** — 65,535 ports, banner grabbing, service detection
182
+ - **DNS recon** — A/AAAA/MX/NS/TXT/SOA/CAA, zone transfer attempts, subdomain brute-force
183
+ - **Certificate transparency** via crt.sh — uncover subdomains via SSL history
184
+ - **SPF/DMARC analysis** — identify email spoofing vulnerabilities
185
+ - **Reverse DNS** and co-hosted domain discovery
186
+
187
+ ### 🔬 Intelligence APIs (30+ Integrations)
188
+
189
+ | Category | APIs |
190
+ |----------|------|
191
+ | **Network Scanning** | Shodan, Censys, ZoomEye, BinaryEdge |
192
+ | **Threat Intelligence** | VirusTotal, AbuseIPDB, GreyNoise, AlienVault OTX |
193
+ | **Email** | Hunter.io, HaveIBeenPwned, HaveIBeenPwned |
194
+ | **Domain/Web** | SecurityTrails, URLScan.io, WhoisXML, Local WHOIS |
195
+ | **Geolocation** | IPInfo.io |
196
+ | **People Search** | Pipl, FullContact, WhitePages, Spokeo, Clearbit |
197
+ | **Social** | GitHub, Twitter/X |
198
+ | **Custom** | Bring your own API via plugin architecture |
199
+
200
+ ### 👤 Shadow Profiler (People Intelligence)
201
+ LexisNexis-style identity aggregation from public records:
202
+ - Cross-correlates data from multiple people-search APIs
203
+ - Discovers emails, phones, addresses, relatives, employers
204
+ - Breach data correlation via HIBP and other sources
205
+ - Social media profile linking
206
+ - **Shadow Score** — digital exposure quantification (0-100)
207
+ - Social graph building and timeline reconstruction
208
+
209
+ ### 📦 Export Formats
210
+ | Format | Description |
211
+ |--------|-------------|
212
+ | **JSON** | Raw machine-readable data |
213
+ | **CSV** | Spreadsheet-compatible |
214
+ | **HTML** | Self-contained cyberpunk-styled report |
215
+ | **PDF** | Professional dossier via ReportLab |
216
+ | **XML** | Structured data |
217
+ | **XLSX** | Excel workbook |
218
+ | **STIX 2.1** | Threat intelligence sharing format |
219
+ | **Markdown** | Human-readable report |
220
+
221
+ All formats support **ZIP compression** and **AES-256-GCM encryption**.
222
+
223
+ ### 🌑 Ghost Mode
224
+ - Low-and-slow scanning profiles to minimize detection
225
+ - Identity rotation via user-agent spoofing
226
+ - Tor proxy integration (Docker compose profile: `ghost`)
227
+ - Configurable request jitter and delays
228
+
229
+ ### 🔔 Additional Features
230
+ - **Real-time live feed** — WebSocket-powered terminal during scans
231
+ - **Shadow Score** — composite risk/exposure scoring
232
+ - **Scheduled Phantoms** — recurring automated ghost runs
233
+ - **API health monitor** — dashboard showing configured APIs and rate limits
234
+ - **Light/Dark theme** — toggle between cyberpunk Dark mode and "Phantom Dawn" Light mode via the ☀/🌙 button; preference persisted in localStorage
235
+ - **Full REST API** — integrate OwlScan into your own toolchain
236
+ - **CLI interface** — `owlscan scan`, `owlscan profile`, `owlscan export`
237
+ - **Docker** — single-command deployment
238
+
239
+ ---
240
+
241
+ ## 🚀 Quick Start
242
+
243
+ ### Option 1: Docker (Recommended)
244
+ ```bash
245
+ git clone https://github.com/owlscan/owlscan
246
+ cd owlscan
247
+ docker-compose up -d
248
+ # Open http://localhost:5000
249
+ ```
250
+
251
+ ### Option 2: Manual Installation
252
+ ```bash
253
+ # Python 3.10+ required
254
+ git clone https://github.com/owlscan/owlscan
255
+ cd owlscan
256
+ pip install -e .
257
+ owlscan init
258
+ owlscan web --open-browser
259
+ ```
260
+
261
+ ### Option 3: CLI Scan
262
+ ```bash
263
+ # Quick probe
264
+ owlscan scan example.com --profile quick
265
+
266
+ # Full spectrum with export
267
+ owlscan scan 192.168.1.1 --type ip_recon --format html --output ./reports
268
+
269
+ # People intelligence
270
+ owlscan profile --email target@company.com --first-name John --last-name Doe
271
+ ```
272
+
273
+ ---
274
+
275
+ ## ⚙️ Configuration
276
+
277
+ ### Environment Variables (Recommended for API Keys)
278
+ ```bash
279
+ export SHODAN_API_KEY="your-shodan-key"
280
+ export VIRUSTOTAL_API_KEY="your-vt-key"
281
+ export HUNTER_API_KEY="your-hunter-key"
282
+ export HIBP_API_KEY="your-hibp-key"
283
+ export GREYNOISE_API_KEY="your-greynoise-key"
284
+ export IPINFO_TOKEN="your-ipinfo-token"
285
+ export ABUSEIPDB_API_KEY="your-abuseipdb-key"
286
+ export ALIENVAULT_API_KEY="your-otx-key"
287
+ export GITHUB_TOKEN="your-github-token"
288
+ export SECURITYTRAILS_API_KEY="your-st-key"
289
+ # See config/owlscan.yaml for full list
290
+ ```
291
+
292
+ ### Config File
293
+ Copy `config/owlscan.yaml` to `~/.owlscan/config.yaml` and customize.
294
+
295
+ ---
296
+
297
+ ## 🔌 Adding Custom APIs
298
+
299
+ OwlScan uses a plugin architecture. Adding a new intelligence source takes ~20 lines:
300
+
301
+ ```python
302
+ # owlscan/intel/apis/my_api.py
303
+ from owlscan.intel.apis.base import BaseIntelAPI, register_api, APICategory, APITier
304
+
305
+ @register_api
306
+ class MyAPI(BaseIntelAPI):
307
+ NAME = "myapi"
308
+ DESCRIPTION = "My custom intelligence source"
309
+ REQUIRES_KEY = True
310
+ TIER = APITier.FREE_LIMITED
311
+ CATEGORIES = [APICategory.NETWORK]
312
+ BASE_URL = "https://api.myservice.com/v1"
313
+ SIGN_UP_URL = "https://myservice.com/signup"
314
+
315
+ async def search(self, query: str, **kwargs):
316
+ data = await self._get(
317
+ f"{self.BASE_URL}/search",
318
+ params={"q": query, "key": self._api_key}
319
+ )
320
+ return [self._wrap_result("my_result", data)]
321
+ ```
322
+
323
+ Then import it in `owlscan/intel/orchestrator.py` and it auto-registers.
324
+
325
+ ---
326
+
327
+ ## 🏗 Architecture
328
+
329
+ ```
330
+ owlscan/
331
+ ├── core/ — Engine, config, database, models
332
+ ├── scrapers/ — Scrapy crawler, tech detector, port scanner, API hunter, DNS recon
333
+ ├── intel/
334
+ │ ├── apis/ — 30+ API integrations (plugin architecture)
335
+ │ └── people/ — People intelligence aggregation
336
+ ├── exporters/ — JSON/CSV/PDF/HTML/XML/XLSX/STIX + crypto wrapper
337
+ └── web/
338
+ ├── routes/ — Flask blueprints (dashboard, scans, intel, settings, export, REST API)
339
+ ├── templates/ — Cyberpunk Jinja2 templates
340
+ └── static/ — CSS (cyberpunk), JS (matrix, terminal, app)
341
+ ```
342
+
343
+ ---
344
+
345
+ ## 🛡 REST API
346
+
347
+ ```bash
348
+ # Create a scan
349
+ curl -X POST http://localhost:5000/api/v1/scans \
350
+ -H "Content-Type: application/json" \
351
+ -d '{"target": "example.com", "scan_type": "web_recon"}'
352
+
353
+ # Get results
354
+ curl http://localhost:5000/api/v1/scans/{scan_id}
355
+
356
+ # List all APIs
357
+ curl http://localhost:5000/api/v1/apis
358
+
359
+ # Health check
360
+ curl http://localhost:5000/api/v1/health
361
+ ```
362
+
363
+ ---
364
+
365
+ ## 🤝 Contributing
366
+
367
+ OwlScan thrives on community contributions. Ways to help:
368
+
369
+ 1. **Add API integrations** — Follow the plugin pattern above
370
+ 2. **Improve detection signatures** — Expand `tech_detector.py`
371
+ 3. **Bug reports** — [GitHub Issues](https://github.com/owlscan/owlscan/issues)
372
+ 4. **Documentation** — Improve the wiki
373
+ 5. **Translations** — Internationalize the UI
374
+
375
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines. Please also review our [Code of Conduct](CODE_OF_CONDUCT.md) and [Security Policy](SECURITY.md).
376
+
377
+ ---
378
+
379
+ ## 📖 Documentation
380
+
381
+ - **[Usage Guide](docs/USAGE.md)** — full walkthroughs, usage scenarios, CLI reference, and per-platform troubleshooting (Linux / macOS / Windows / Docker)
382
+
383
+ ---
384
+
385
+ ## ⚠️ Legal & Ethics
386
+
387
+ OwlScan is a dual-use tool. Operators are responsible for:
388
+ - Obtaining explicit authorization before scanning any system
389
+ - Complying with applicable laws (CFAA, GDPR, CCPA, ECPA, local laws)
390
+ - Respecting privacy and data protection regulations
391
+ - Not using this tool for harassment, stalking, or unauthorized surveillance
392
+
393
+ **The developers provide this software as-is with no warranty. Misuse is your responsibility.**
394
+
395
+ ---
396
+
397
+ ## 🏷 Topics
398
+
399
+ [![osint](https://img.shields.io/badge/osint-00ff41?style=flat-square)](https://github.com/topics/osint)
400
+ [![security](https://img.shields.io/badge/security-00f3ff?style=flat-square)](https://github.com/topics/security)
401
+ [![python](https://img.shields.io/badge/python-00f3ff?style=flat-square)](https://github.com/topics/python)
402
+ [![hacking](https://img.shields.io/badge/hacking-00ff41?style=flat-square)](https://github.com/topics/hacking)
403
+ [![cybersecurity](https://img.shields.io/badge/cybersecurity-b026ff?style=flat-square)](https://github.com/topics/cybersecurity)
404
+ [![reconnaissance](https://img.shields.io/badge/reconnaissance-00ff41?style=flat-square)](https://github.com/topics/reconnaissance)
405
+ [![recon](https://img.shields.io/badge/recon-00f3ff?style=flat-square)](https://github.com/topics/recon)
406
+ [![penetration-testing](https://img.shields.io/badge/penetration--testing-b026ff?style=flat-square)](https://github.com/topics/penetration-testing)
407
+ [![ethical-hacking](https://img.shields.io/badge/ethical--hacking-00ff41?style=flat-square)](https://github.com/topics/ethical-hacking)
408
+ [![bug-bounty](https://img.shields.io/badge/bug--bounty-00f3ff?style=flat-square)](https://github.com/topics/bug-bounty)
409
+ [![information-gathering](https://img.shields.io/badge/information--gathering-b026ff?style=flat-square)](https://github.com/topics/information-gathering)
410
+ [![threat-intelligence](https://img.shields.io/badge/threat--intelligence-00ff41?style=flat-square)](https://github.com/topics/threat-intelligence)
411
+ [![security-tools](https://img.shields.io/badge/security--tools-00f3ff?style=flat-square)](https://github.com/topics/security-tools)
412
+ [![network-scanner](https://img.shields.io/badge/network--scanner-b026ff?style=flat-square)](https://github.com/topics/network-scanner)
413
+ [![dns-recon](https://img.shields.io/badge/dns--recon-00ff41?style=flat-square)](https://github.com/topics/dns-recon)
414
+ [![infosec](https://img.shields.io/badge/infosec-00f3ff?style=flat-square)](https://github.com/topics/infosec)
415
+ [![flask](https://img.shields.io/badge/flask-b026ff?style=flat-square)](https://github.com/topics/flask)
416
+ [![security-research](https://img.shields.io/badge/security--research-00ff41?style=flat-square)](https://github.com/topics/security-research)
417
+ [![footprinting](https://img.shields.io/badge/footprinting-00f3ff?style=flat-square)](https://github.com/topics/footprinting)
418
+ [![automation](https://img.shields.io/badge/automation-b026ff?style=flat-square)](https://github.com/topics/automation)
419
+
420
+ ---
421
+
422
+ ## 🤝 Community
423
+
424
+ | Document | Description |
425
+ |----------|-------------|
426
+ | [Code of Conduct](CODE_OF_CONDUCT.md) | Community standards and expectations |
427
+ | [Contributing Guidelines](CONTRIBUTING.md) | How to contribute to OwlScan |
428
+ | [Security Policy](SECURITY.md) | Reporting vulnerabilities responsibly |
429
+ | [License](LICENSE) | MIT License terms |
430
+
431
+ ---
432
+
433
+ ## 📜 License
434
+
435
+ MIT License — see [LICENSE](LICENSE)
436
+
437
+ ---
438
+
439
+ *Built with questionable amounts of caffeine. "The night sees all. The owl forgets nothing."*
440
+ *Some ghosts leave no trace. This one left commits. — Claude*