Saturday, April 19, 2025

Superior OSINT Investigation Platform Combining Graph Visualization, Timeline Evaluation, And AI Help To Uncover Hidden Connections In Knowledge




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

  1. Clone the repository: bash git clone https://github.com/ALW1EZ/PANO.git cd PANO

  2. Run the applying:

  3. Linux: ./start_pano.sh
  4. 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;

  1. Choose venv manually
  2. Linux: supply venv/bin/activate
  3. Home windows: name venvScriptsactivate
  4. See learn how to login right here

💡 Fast Begin Information

  1. Create Investigation: Begin a brand new investigation or load an present one
  2. Add Entities: Drag entities from the sidebar onto the graph
  3. Uncover Connections: Use transforms to robotically discover relationships
  4. Analyze: Use timeline and map views to know patterns
  5. 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:

  1. Fork the repository at https://github.com/ALW1EZ/PANO/
  2. Make your adjustments in your fork
  3. Take a look at your adjustments totally
  4. Create a Pull Request to our principal department
  5. In your PR description, embrace:
  6. What the adjustments do
  7. Why you made these adjustments
  8. Any testing you have executed
  9. Screenshots if relevant

Word: We use a single principal department for growth. All pull requests ought to be made on to principal.

📖 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 asyncSlot

class 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 ❤️



Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles

PHP Code Snippets Powered By : XYZScripts.com