PANO
๐ 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.
Install / Use
/learn @ALW1EZ/PANOREADME
PANO - Platform for Analysis and Network Operations
<div align="center">
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.
Getting Started โข Features โข Documentation โข Contributing
https://github.com/user-attachments/assets/6b95e97a-ffdd-4056-b12b-f268d8e5d565
https://github.com/user-attachments/assets/af0c0f65-7b79-417c-a678-a789d42a6003
https://github.com/user-attachments/assets/568b4c28-be78-4559-a607-899fca2f9613
https://github.com/user-attachments/assets/6aa191eb-09de-41d5-b96f-4a2e32d6a0c2
https://github.com/user-attachments/assets/96377b80-e137-4eb4-9387-a0db4e49c2c1
https://github.com/user-attachments/assets/4228bda0-6c13-4ea9-bc07-d87abe367e10
</div>๐ Getting Started
-
Clone the repository:
git clone https://github.com/ALW1EZ/PANO.git cd PANO -
Run the application:
- Linux:
./start_pano.sh - Windows:
start_pano.bat
- Linux:
The startup script will automatically:
- Check for updates
- Set up the Python environment
- Install dependencies
- Launch PANO
In order to use Email Lookup transform You need to login with GHunt first. After starting the pano via starter scripts;
- Select venv manually
- Linux:
source venv/bin/activate - Windows:
call venv\Scripts\activate
- Linux:
- See how to login here
๐ก Quick Start Guide
- Create Investigation: Start a new investigation or load an existing one
- Add Entities: Drag entities from the sidebar onto the graph
- Discover Connections: Use transforms to automatically find relationships
- Analyze: Use timeline and map views to understand patterns
- Save: Export your investigation for later use
๐ Features
๐ธ๏ธ Core Functionality
-
Interactive Graph Visualization
- Drag-and-drop entity creation
- Multiple layout algorithms (Circular, Hierarchical, Radial, Force-Directed)
- Dynamic relationship mapping
- Visual node and edge styling
-
Timeline Analysis
- Chronological event visualization
- Interactive timeline navigation
- Event filtering and grouping
- Temporal relationship analysis
-
Map Integration
- Geographic data visualization
- Location-based analysis
- Interactive mapping features
- Coordinate plotting and tracking
๐ฏ Entity Management
- Supported Entity Types
- ๐ง Email addresses
- ๐ค Usernames
- ๐ Websites
- ๐ผ๏ธ Images
- ๐ Locations
- โฐ Events
- ๐ Text content
- ๐ง Custom entity types
๐ Transform System
-
Email Analysis
- Google account investigation
- Calendar event extraction
- Location history analysis
- Connected services discovery
-
Username Analysis
- Cross-platform username search
- Social media profile discovery
- Platform correlation
- Web presence analysis
-
Image Analysis
- Reverse image search
- Visual content analysis
- Metadata extraction
- Related image discovery
๐ค AI Integration
- PANAI
- Natural language investigation assistant
- Automated entity extraction and relationship mapping
- Pattern recognition and anomaly detection
- Multi-language support
- Context-aware suggestions
- Timeline and graph analysis
๐งฉ Core Components
๐ฆ Entities
Entities are the fundamental building blocks of PANO. They represent distinct pieces of information that can be connected and analyzed:
-
Built-in Types
- ๐ง Email: Email addresses with service detection
- ๐ค Username: Social media and platform usernames
- ๐ Website: Web pages with metadata
- ๐ผ๏ธ Image: Images with EXIF and analysis
- ๐ Location: Geographic coordinates and addresses
- โฐ Event: Time-based occurrences
- ๐ Text: Generic text content
-
Properties System
- Type-safe property validation
- Automatic property getters
- Dynamic property updates
- Custom property types
- Metadata support
โก Transforms
Transforms are automated operations that process entities to discover new information and relationships:
-
Operation Types
- ๐ Discovery: Find new entities from existing ones
- ๐ Correlation: Connect related entities
- ๐ Analysis: Extract insights from entity data
- ๐ OSINT: Gather open-source intelligence
- ๐ Enrichment: Add data to existing entities
-
Features
- Async operation support
- Progress tracking
- Error handling
- Rate limiting
- Result validation
๐ ๏ธ Helpers
Helpers are specialized tools with dedicated UIs for specific investigation tasks:
-
Available Helpers
- ๐ Cross-Examination: Analyze statements and testimonies
- ๐ค Portrait Creator: Generate facial composites
- ๐ธ Media Analyzer: Advanced image processing and analysis
- ๐ Base Searcher: Search near places of interest
- ๐ Translator: Translate text between languages
-
Helper Features
- Custom Qt interfaces
- Real-time updates
- Graph integration
- Data visualization
- Export capabilities
๐ฅ Contributing
We welcome contributions! To contribute to PANO:
- Fork the repository at https://github.com/ALW1EZ/PANO/
- Make your changes in your fork
- Test your changes thoroughly
- Create a Pull Request to our main branch
- In your PR description, include:
- What the changes do
- Why you made these changes
- Any testing you've done
- Screenshots if applicable
Note: We use a single
mainbranch for development. All pull requests should be made directly tomain.
๐ Development Guide
<details> <summary>Click to expand development documentation</summary>System Requirements
- Operating System: Windows or Linux
- Python 3.11+
- PySide6 for GUI
- Internet connection for online features
Custom Entities
Entities are the core data structures in PANO. Each entity represents a piece of information with specific properties and behaviors. To create a custom entity:
- Create a new file in the
entitiesfolder (e.g.,entities/phone_number.py) - Implement your entity class:
from dataclasses import dataclass
from typing import ClassVar, Dict, Any
from .base import Entity
@dataclass
class PhoneNumber(Entity):
name: ClassVar[str] = "Phone Number"
description: ClassVar[str] = "A phone number entity with country code and validation"
def init_properties(self):
"""Initialize phone number properties"""
self.setup_properties({
"number": str,
"country_code": str,
"carrier": str,
"type": str, # mobile, landline, etc.
"verified": bool
})
def update_label(self):
"""Update the display label"""
self.label = self.format_label(["country_code", "number"])
Custom Transforms
Transforms are operations that process entities and generate new insights or relationships. To create a custom transform:
- Create a new file in the
transformsfolder (e.g.,transforms/phone_lookup.py) - Implement your transform class:
from dataclasses import dataclass
from typing import ClassVar, List
from .base import Transform
from entities.base import Entity
from entities.phone_number import PhoneNumber
from entities.location import Location
from ui.managers.status_manager import StatusManager
@dataclass
class PhoneLookup(Transform):
name: ClassVar[str] = "Phone Number Lookup"
description: ClassVar[str] = "Lookup phone number details and location"
input_types: ClassVar[List[str]] = ["PhoneNumber"]
output_types: ClassVar[List[str]] = ["Location"]
async def run(self, entity: PhoneNumber, graph) -> List[Entity]:
if not isinstance(entity, PhoneNumber):
return []
status = StatusManager.get()
operation_id = status.start_loading("Phone Lookup")
try:
# Your phone number lookup logic here
# Example: query an API for phone number details
location = Location(properties={
"country": "Example Country",
"region": "Example Region",
"carrier": "Example Carrier",
"source": "PhoneLookup transform"
})
return [location]
except Exception as e:
status.set_text(f"Error during phone lookup: {str(e)}")
return []
finally:
status.stop_loading(operation_id)
Custom Helpers
Helpers are specialized tools that provide additional investigation capabilities through a dedicated UI interface. To create a custom helper:
- Create a new file in the
helpersfolder (e.g.,helpers/data_analyzer.py) - Implement your helper class:
from PySide6.QtWidgets import (
QWidget, QVBoxLayout, QHBoxLayout, QPushButton,
QTextEdit, QLabel, QComboBox
)
from .base import BaseHelper
from qasync import asyncSlot
class DummyHelper(BaseHelper):
"""A dummy helper for testing"""
name = "Dummy Helper"
description = "A dummy helper for testing"
def setup_ui(self):
"""Initialize the helper's user interface"""
# Create input text area
self.input_label = QLabel("Input:")
self.input_text = QTextEdit()
self.input_text.setPlaceholderText("Enter text to p
Related Skills
node-connect
345.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
104.6kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
345.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
345.4kQQBot ๅฏๅชไฝๆถๅ่ฝๅใไฝฟ็จ <qqmedia> ๆ ็ญพ๏ผ็ณป็ปๆ นๆฎๆไปถๆฉๅฑๅ่ชๅจ่ฏๅซ็ฑปๅ๏ผๅพ็/่ฏญ้ณ/่ง้ข/ๆไปถ๏ผใ
