{"id":27751190,"url":"https://github.com/ALW1EZ/PANO","last_synced_at":"2025-04-29T02:02:22.519Z","repository":{"id":276382598,"uuid":"910281567","full_name":"ALW1EZ/PANO","owner":"ALW1EZ","description":"🔍 PANO: Advanced OSINT investigation platform combining graph visualization, timeline analysis, and AI assistance to uncover hidden connections in data. Built with Python and modern Qt.","archived":false,"fork":false,"pushed_at":"2025-04-26T01:31:34.000Z","size":733,"stargazers_count":134,"open_issues_count":0,"forks_count":13,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-26T02:36:13.795Z","etag":null,"topics":["cybersecurity","investigation","investigation-platform","osint"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ALW1EZ.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-12-30T21:50:44.000Z","updated_at":"2025-04-26T01:31:37.000Z","dependencies_parsed_at":"2025-02-07T22:29:40.521Z","dependency_job_id":"621ebc22-e87c-4482-91db-458698edd305","html_url":"https://github.com/ALW1EZ/PANO","commit_stats":null,"previous_names":["alw1ez/pano"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALW1EZ%2FPANO","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALW1EZ%2FPANO/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALW1EZ%2FPANO/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ALW1EZ%2FPANO/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ALW1EZ","download_url":"https://codeload.github.com/ALW1EZ/PANO/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251419988,"owners_count":21586526,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cybersecurity","investigation","investigation-platform","osint"],"created_at":"2025-04-29T02:01:55.025Z","updated_at":"2025-04-29T02:02:22.492Z","avatar_url":"https://github.com/ALW1EZ.png","language":"Python","funding_links":[],"categories":["Python","Tools","osint"],"sub_categories":["Command line/self hosted tools"],"readme":"# PANO - Platform for Analysis and Network Operations\n\n\u003cdiv align=\"center\"\u003e\n\n![PANO Logo](ui/LOGO.png)\n\n[![License: CC BY-NC](https://img.shields.io/badge/License-CC%20BY--NC-lightgrey.svg)](https://creativecommons.org/licenses/by-nc/4.0/)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)\n[![PySide6](https://img.shields.io/badge/GUI-PySide6-brightgreen.svg)](https://wiki.qt.io/Qt_for_Python)\n[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux-orange.svg)](https://github.com/ALW1EZ/PANO/)\n\n**PANO** is a powerful OSINT investigation platform that combines graph visualization, timeline analysis, and AI-powered tools to help you uncover hidden connections and patterns in your data.\n\n[Getting Started](#getting-started) • [Features](#features) • [Documentation](#development-guide) • [Contributing](#contributing)\n\n---\n\nhttps://github.com/user-attachments/assets/6b95e97a-ffdd-4056-b12b-f268d8e5d565\n\nhttps://github.com/user-attachments/assets/af0c0f65-7b79-417c-a678-a789d42a6003\n\nhttps://github.com/user-attachments/assets/568b4c28-be78-4559-a607-899fca2f9613\n\nhttps://github.com/user-attachments/assets/6aa191eb-09de-41d5-b96f-4a2e32d6a0c2\n\nhttps://github.com/user-attachments/assets/96377b80-e137-4eb4-9387-a0db4e49c2c1\n\nhttps://github.com/user-attachments/assets/4228bda0-6c13-4ea9-bc07-d87abe367e10\n\n\u003c/div\u003e\n\n## 🚀 Getting Started\n\n1. Clone the repository:\n   ```bash\n   git clone https://github.com/ALW1EZ/PANO.git\n   cd PANO\n   ```\n\n2. Run the application:\n   - Linux: `./start_pano.sh`\n   - Windows: `start_pano.bat`\n\nThe startup script will automatically:\n- Check for updates\n- Set up the Python environment\n- Install dependencies\n- Launch PANO\n\nIn order to use Email Lookup transform\nYou need to login with GHunt first.\nAfter starting the pano via starter scripts;\n\n1. Select venv manually\n   - Linux: `source venv/bin/activate`\n   - Windows: `call venv\\Scripts\\activate`\n3. See how to login [here](https://github.com/mxrch/GHunt/?tab=readme-ov-file#login)\n\n## 💡 Quick Start Guide\n\n1. **Create Investigation**: Start a new investigation or load an existing one\n2. **Add Entities**: Drag entities from the sidebar onto the graph\n3. **Discover Connections**: Use transforms to automatically find relationships\n4. **Analyze**: Use timeline and map views to understand patterns\n5. **Save**: Export your investigation for later use\n\n## 🔍 Features\n\n### 🕸️ Core Functionality\n\n- **Interactive Graph Visualization**\n  - Drag-and-drop entity creation\n  - Multiple layout algorithms (Circular, Hierarchical, Radial, Force-Directed)\n  - Dynamic relationship mapping\n  - Visual node and edge styling\n\n- **Timeline Analysis**\n  - Chronological event visualization\n  - Interactive timeline navigation\n  - Event filtering and grouping\n  - Temporal relationship analysis\n\n- **Map Integration**\n  - Geographic data visualization\n  - Location-based analysis\n  - Interactive mapping features\n  - Coordinate plotting and tracking\n\n### 🎯 Entity Management\n\n- **Supported Entity Types**\n  - 📧 Email addresses\n  - 👤 Usernames\n  - 🌐 Websites\n  - 🖼️ Images\n  - 📍 Locations\n  - ⏰ Events\n  - 📝 Text content\n  - 🔧 Custom entity types\n\n### 🔄 Transform System\n\n- **Email Analysis**\n  - Google account investigation\n  - Calendar event extraction\n  - Location history analysis\n  - Connected services discovery\n\n- **Username Analysis**\n  - Cross-platform username search\n  - Social media profile discovery\n  - Platform correlation\n  - Web presence analysis\n\n- **Image Analysis**\n  - Reverse image search\n  - Visual content analysis\n  - Metadata extraction\n  - Related image discovery\n\n### 🤖 AI Integration\n\n- **PANAI**\n  - Natural language investigation assistant\n  - Automated entity extraction and relationship mapping\n  - Pattern recognition and anomaly detection\n  - Multi-language support\n  - Context-aware suggestions\n  - Timeline and graph analysis\n\n## 🧩 Core Components\n\n### 📦 Entities\n\nEntities are the fundamental building blocks of PANO. They represent distinct pieces of information that can be connected and analyzed:\n\n- **Built-in Types**\n  - 📧 Email: Email addresses with service detection\n  - 👤 Username: Social media and platform usernames\n  - 🌐 Website: Web pages with metadata\n  - 🖼️ Image: Images with EXIF and analysis\n  - 📍 Location: Geographic coordinates and addresses\n  - ⏰ Event: Time-based occurrences\n  - 📝 Text: Generic text content\n\n- **Properties System**\n  - Type-safe property validation\n  - Automatic property getters\n  - Dynamic property updates\n  - Custom property types\n  - Metadata support\n\n### ⚡ Transforms\n\nTransforms are automated operations that process entities to discover new information and relationships:\n\n- **Operation Types**\n  - 🔍 Discovery: Find new entities from existing ones\n  - 🔗 Correlation: Connect related entities\n  - 📊 Analysis: Extract insights from entity data\n  - 🌐 OSINT: Gather open-source intelligence\n  - 🔄 Enrichment: Add data to existing entities\n\n- **Features**\n  - Async operation support\n  - Progress tracking\n  - Error handling\n  - Rate limiting\n  - Result validation\n\n### 🛠️ Helpers\n\nHelpers are specialized tools with dedicated UIs for specific investigation tasks:\n\n- **Available Helpers**\n  - 🔍 Cross-Examination: Analyze statements and testimonies\n  - 👤 Portrait Creator: Generate facial composites\n  - 📸 Media Analyzer: Advanced image processing and analysis\n  - 🔍 Base Searcher: Search near places of interest\n  - 🔄 Translator: Translate text between languages\n\n- **Helper Features**\n  - Custom Qt interfaces\n  - Real-time updates\n  - Graph integration\n  - Data visualization\n  - Export capabilities\n\n## 👥 Contributing\n\nWe welcome contributions! To contribute to PANO:\n\n1. Fork the repository at https://github.com/ALW1EZ/PANO/\n2. Make your changes in your fork\n3. Test your changes thoroughly\n4. Create a Pull Request to our main branch\n5. In your PR description, include:\n   - What the changes do\n   - Why you made these changes\n   - Any testing you've done\n   - Screenshots if applicable\n\n\u003e **Note**: We use a single `main` branch for development. All pull requests should be made directly to `main`.\n\n## 📖 Development Guide\n\n\u003cdetails\u003e\n\u003csummary\u003eClick to expand development documentation\u003c/summary\u003e\n\n### System Requirements\n\n- Operating System: Windows or Linux\n- Python 3.11+\n- PySide6 for GUI\n- Internet connection for online features\n\n### Custom Entities\n\nEntities are the core data structures in PANO. Each entity represents a piece of information with specific properties and behaviors. To create a custom entity:\n\n1. Create a new file in the `entities` folder (e.g., `entities/phone_number.py`)\n2. Implement your entity class:\n\n```python\nfrom dataclasses import dataclass\nfrom typing import ClassVar, Dict, Any\nfrom .base import Entity\n\n@dataclass\nclass PhoneNumber(Entity):\n    name: ClassVar[str] = \"Phone Number\"\n    description: ClassVar[str] = \"A phone number entity with country code and validation\"\n    \n    def init_properties(self):\n        \"\"\"Initialize phone number properties\"\"\"\n        self.setup_properties({\n            \"number\": str,\n            \"country_code\": str,\n            \"carrier\": str,\n            \"type\": str,  # mobile, landline, etc.\n            \"verified\": bool\n        })\n    \n    def update_label(self):\n        \"\"\"Update the display label\"\"\"\n        self.label = self.format_label([\"country_code\", \"number\"])\n```\n\n### Custom Transforms\n\nTransforms are operations that process entities and generate new insights or relationships. To create a custom transform:\n\n1. Create a new file in the `transforms` folder (e.g., `transforms/phone_lookup.py`)\n2. Implement your transform class:\n\n```python\nfrom dataclasses import dataclass\nfrom typing import ClassVar, List\nfrom .base import Transform\nfrom entities.base import Entity\nfrom entities.phone_number import PhoneNumber\nfrom entities.location import Location\nfrom ui.managers.status_manager import StatusManager\n\n@dataclass\nclass PhoneLookup(Transform):\n    name: ClassVar[str] = \"Phone Number Lookup\"\n    description: ClassVar[str] = \"Lookup phone number details and location\"\n    input_types: ClassVar[List[str]] = [\"PhoneNumber\"]\n    output_types: ClassVar[List[str]] = [\"Location\"]\n    \n    async def run(self, entity: PhoneNumber, graph) -\u003e List[Entity]:\n        if not isinstance(entity, PhoneNumber):\n            return []\n            \n        status = StatusManager.get()\n        operation_id = status.start_loading(\"Phone Lookup\")\n        \n        try:\n            # Your phone number lookup logic here\n            # Example: query an API for phone number details\n            location = Location(properties={\n                \"country\": \"Example Country\",\n                \"region\": \"Example Region\",\n                \"carrier\": \"Example Carrier\",\n                \"source\": \"PhoneLookup transform\"\n            })\n            \n            return [location]\n            \n        except Exception as e:\n            status.set_text(f\"Error during phone lookup: {str(e)}\")\n            return []\n            \n        finally:\n            status.stop_loading(operation_id)\n```\n\n### Custom Helpers\n\nHelpers are specialized tools that provide additional investigation capabilities through a dedicated UI interface. To create a custom helper:\n\n1. Create a new file in the `helpers` folder (e.g., `helpers/data_analyzer.py`)\n2. Implement your helper class:\n\n```python\nfrom PySide6.QtWidgets import (\n    QWidget, QVBoxLayout, QHBoxLayout, QPushButton,\n    QTextEdit, QLabel, QComboBox\n)\nfrom .base import BaseHelper\nfrom qasync import asyncSlot\n\nclass DummyHelper(BaseHelper):\n    \"\"\"A dummy helper for testing\"\"\"\n    \n    name = \"Dummy Helper\" \n    description = \"A dummy helper for testing\"\n    \n    def setup_ui(self):\n        \"\"\"Initialize the helper's user interface\"\"\"\n        # Create input text area\n        self.input_label = QLabel(\"Input:\")\n        self.input_text = QTextEdit()\n        self.input_text.setPlaceholderText(\"Enter text to process...\")\n        self.input_text.setMinimumHeight(100)\n        \n        # Create operation selector\n        operation_layout = QHBoxLayout()\n        self.operation_label = QLabel(\"Operation:\")\n        self.operation_combo = QComboBox()\n        self.operation_combo.addItems([\"Uppercase\", \"Lowercase\", \"Title Case\"])\n        operation_layout.addWidget(self.operation_label)\n        operation_layout.addWidget(self.operation_combo)\n        \n        # Create process button\n        self.process_btn = QPushButton(\"Process\")\n        self.process_btn.clicked.connect(self.process_text)\n        \n        # Create output text area\n        self.output_label = QLabel(\"Output:\")\n        self.output_text = QTextEdit()\n        self.output_text.setReadOnly(True)\n        self.output_text.setMinimumHeight(100)\n        \n        # Add widgets to main layout\n        self.main_layout.addWidget(self.input_label)\n        self.main_layout.addWidget(self.input_text)\n        self.main_layout.addLayout(operation_layout)\n        self.main_layout.addWidget(self.process_btn)\n        self.main_layout.addWidget(self.output_label)\n        self.main_layout.addWidget(self.output_text)\n        \n        # Set dialog size\n        self.resize(400, 500)\n        \n    @asyncSlot()\n    async def process_text(self):\n        \"\"\"Process the input text based on selected operation\"\"\"\n        text = self.input_text.toPlainText()\n        operation = self.operation_combo.currentText()\n        \n        if operation == \"Uppercase\":\n            result = text.upper()\n        elif operation == \"Lowercase\":\n            result = text.lower()\n        else:  # Title Case\n            result = text.title()\n            \n        self.output_text.setPlainText(result)\n```\n\u003c/details\u003e\n\n## 📄 License\n\nThis project is licensed under the Creative Commons Attribution-NonCommercial (CC BY-NC) License.\n\n**You are free to:**\n- ✅ Share: Copy and redistribute the material\n- ✅ Adapt: Remix, transform, and build upon the material\n\n**Under these terms:**\n- ℹ️ Attribution: You must give appropriate credit\n- 🚫 NonCommercial: No commercial use\n- 🔓 No additional restrictions\n\n## 🙏 Acknowledgments\n\nSpecial thanks to all library authors and contributors who made this project possible.\n\n## 👨‍💻 Author\n\nCreated by ALW1EZ with AI ❤️\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FALW1EZ%2FPANO","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FALW1EZ%2FPANO","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FALW1EZ%2FPANO/lists"}