PANO is a strong OSINT investigation platform that mixes graph visualization, timeline evaluation, and AI-powered instruments that will help you uncover hidden connections and patterns in your knowledge.
Getting Began
-
Clone the repository:
bash git clone https://github.com/ALW1EZ/PANO.git cd PANO
-
Run the applying:
- Linux:
./start_pano.sh
- Home windows:
start_pano.bat
The startup script will robotically: – Test for updates – Arrange the Python atmosphere – Set up dependencies – Launch PANO
With the intention to use E-mail Lookup remodel You must login with GHunt first. After beginning the pano by way of starter scripts;
- Choose venv manually
- Linux:
supply venv/bin/activate
- Home windows:
name venvScriptsactivate
- See learn how to login right here
💡 Fast Begin Information
- Create Investigation: Begin a brand new investigation or load an present one
- Add Entities: Drag entities from the sidebar onto the graph
- Uncover Connections: Use transforms to robotically discover relationships
- Analyze: Use timeline and map views to know patterns
- Save: Export your investigation for later use
🔍 Options
🕸️ Core Performance
- Interactive Graph Visualization
- Drag-and-drop entity creation
- A number of structure algorithms (Round, Hierarchical, Radial, Power-Directed)
- Dynamic relationship mapping
-
Visible node and edge styling
-
Timeline Evaluation
- Chronological occasion visualization
- Interactive timeline navigation
- Occasion filtering and grouping
-
Temporal relationship evaluation
-
Map Integration
- Geographic knowledge visualization
- Location-based evaluation
- Interactive mapping options
- Coordinate plotting and monitoring
🎯 Entity Administration
- Supported Entity Sorts
- 📧 E-mail addresses
- 👤 Usernames
- 🌐 Web sites
- 🖼️ Photos
- 📍 Areas
- ⏰ Occasions
- 📝 Textual content content material
- 🔧 Customized entity varieties
🔄 Rework System
🤖 AI Integration
- PANAI
- Pure language investigation assistant
- Automated entity extraction and relationship mapping
- Sample recognition and anomaly detection
- Multi-language help
- Context-aware recommendations
- Timeline and graph evaluation
🧩 Core Parts
📦 Entities
Entities are the basic constructing blocks of PANO. They signify distinct items of knowledge that may be related and analyzed:
⚡ Transforms
Transforms are automated operations that course of entities to find new data and relationships:
🛠️ Helpers
Helpers are specialised instruments with devoted UIs for particular investigation duties:
👥 Contributing
We welcome contributions! To contribute to PANO:
- Fork the repository at https://github.com/ALW1EZ/PANO/
- Make your adjustments in your fork
- Take a look at your adjustments totally
- Create a Pull Request to our principal department
- In your PR description, embrace:
- What the adjustments do
- Why you made these adjustments
- Any testing you have executed
- Screenshots if relevant
Word: We use a single
principal
department for growth. All pull requests ought to be made on toprincipal
.
📖 Improvement Information
Click on to increase growth documentation
### System Necessities – Working System: Home windows or Linux – Python 3.11+ – PySide6 for GUI – Web connection for on-line options ### Customized Entities Entities are the core knowledge constructions in PANO. Every entity represents a bit of knowledge with particular properties and behaviors. To create a customized entity: 1. Create a brand new file within the `entities` folder (e.g., `entities/phone_number.py`) 2. Implement your entity class:
from dataclasses import dataclass
from typing import ClassVar, Dict, Any
from .base import Entity@dataclass
class PhoneNumber(Entity):
identify: ClassVar[str] = "Cellphone Quantity"
description: ClassVar[str] = "A telephone quantity entity with nation code and validation"
def init_properties(self):
"""Initialize telephone quantity properties"""
self.setup_properties({
"quantity": str,
"country_code": str,
"provider": str,
"kind": str, # cellular, landline, and many others.
"verified": bool
})
def update_label(self):
"""Replace the show label"""
self.label = self.format_label(["country_code", "number"])
### Customized Transforms Transforms are operations that course of entities and generate new insights or relationships. To create a customized remodel: 1. Create a brand new file within the `transforms` folder (e.g., `transforms/phone_lookup.py`) 2. Implement your remodel class:
from dataclasses import dataclass
from typing import ClassVar, Listing
from .base import Rework
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(Rework):
identify: ClassVar[str] = "Cellphone Quantity Lookup"
description: ClassVar[str] = "Lookup telephone quantity particulars and site"
input_types: ClassVar[List[str]] = ["PhoneNumber"]
output_types: ClassVar[List[str]] = ["Location"]
async def run(self, entity: PhoneNumber, graph) -> Listing[Entity]:
if not isinstance(entity, PhoneNumber):
return []
standing = StatusManager.get()
operation_id = standing.start_loading("Cellphone Lookup")
strive:
# Your telephone quantity lookup logic right here
# Instance: question an API for telephone quantity particulars
location = Location(properties={
"nation": "Instance Nation",
"area": "Instance Area",
"provider": "Instance Service",
"supply": "PhoneLookup remodel"
})
return [location]
besides Exception as e:
standing.set_text(f"Error throughout telephone lookup: {str(e)}")
return []
lastly:
standing.stop_loading(operation_id)
### Customized Helpers Helpers are specialised instruments that present further investigation capabilities by a devoted UI interface. To create a customized helper: 1. Create a brand new file within the `helpers` folder (e.g., `helpers/data_analyzer.py`) 2. Implement your helper class:
from PySide6.QtWidgets import (
QWidget, QVBoxLayout, QHBoxLayout, QPushButton,
QTextEdit, QLabel, QComboBox
)
from .base import BaseHelper
from qasync import asyncSlotclass DummyHelper(BaseHelper):
"""A dummy helper for testing"""
identify = "Dummy Helper"
description = "A dummy helper for testing"
def setup_ui(self):
"""Initialize the helper's consumer interface"""
# Create enter textual content space
self.input_label = QLabel("Enter:")
self.input_text = QTextEdit()
self.input_text.setPlaceholderText("Enter textual content to course of...")
self.input_text.setMinimumHeight(100)
# Create operation selector
operation_layout = QHBoxLayout()
self.operation_label = QLabel("Operation:")
self.operation_combo = QComboBox()
self.operation_combo.addItems(["Uppercase", "Lowercase", "Title Case"])
operation_layout.addWidget(self.operation_label)
operation_layout.addWidget(self.operation_combo)
# Create course of button
self.process_btn = QPushButton("Course of")
self.process_btn.clicked.join(self.process_text)
# Create output textual content space
self.output_label = QLabel("Output:")
self.output_text = QTextEdit()
self.output_text.setReadOnly(True)
self.output_text.setMinimumHeight(100)
# Add widgets to principal structure
self.main_layout.addWidget(self.input_label)
self.main_layout.addWidget(self.input_text)
self.main_layout.addLayout(operation_layout)
self.main_layout.addWidget(self.process_btn)
self.main_layout.addWidget(self.output_label)
self.main_layout.addWidget(self.output_text)
# Set dialog dimension
self.resize(400, 500)
@asyncSlot()
async def process_text(self):
"""Course of the enter textual content primarily based on chosen operation"""
textual content = self.input_text.toPlainText()
operation = self.operation_combo.currentText()
if operation == "Uppercase":
consequence = textual content.higher()
elif operation == "Lowercase":
consequence = textual content.decrease()
else: # Title Case
consequence = textual content.title()
self.output_text.setPlainText(consequence)
📄 License
This mission is licensed beneath the Artistic Commons Attribution-NonCommercial (CC BY-NC) License.
You’re free to: – ✅ Share: Copy and redistribute the fabric – ✅ Adapt: Remix, remodel, and construct upon the fabric
Below these phrases: – ℹ️ Attribution: You could give applicable credit score – 🚫 NonCommercial: No industrial use – 🔓 No further restrictions
🙏 Acknowledgments
Particular due to all library authors and contributors who made this mission doable.
👨💻 Writer
Created by ALW1EZ with AI ❤️