Skip to main content

Introducing OSINTBuddy: Reloaded

Logo

I have no data yet. It is a capital mistake to theorize before one has data. Insensibly one begins to twist facts to suit theories, instead of theories to suit facts.


The OSINTBuddy Plugins Framework

PyPI version Python 3.12+ License: MIT

The plugin framework for OSINTBuddy, a graph-based OSINT platform for recon, OSINT investigations, link analysis, and more. Offline. Local-first workflows. No cloud dependency.

Overview

OSINTBuddy's plugin system enables you to define entities (nodes in the graph) and transforms (operations that create new entities from existing ones). The framework provides:

  • Entity definitions with rich metadata, icons, colors, and form elements
  • Transform decorators with dependency management and version targeting
  • Result types for subgraphs, custom edges, and file attachments
  • Field types for semantic type-based transform matching
  • Settings framework for persistent configuration
  • CLI tools for development and integration

Installation

pip install osintbuddy[all]

For development:

git clone https://github.com/osintbuddy/plugins.git
cd plugins/
pip install -e ".[dev]"

Quick Start

Define an Entity

from osintbuddy import Plugin
from osintbuddy.elements import TextInput, CopyText
from osintbuddy.types import FieldType

class EmailEntity(Plugin):
    version = "1.0.0"
    label = "Email"
    icon = "mail"
    color = "#3B82F6"
    category = "Identity"

    elements = [
        TextInput(label="Email", icon="mail", field_type=FieldType.EMAIL),
        CopyText(label="Domain"),
    ]

Create a Transform

from osintbuddy import transform, Entity, Edge

@transform(
    target="email@>=1.0.0",
    label="Extract Domain",
    icon="world",
)
async def extract_domain(entity):
    email = entity.email
    domain = email.split("@")[1] if "@" in email else None

    if domain:
        return Entity(
            data=DomainEntity.blueprint(domain=domain),
            edge=Edge(label="has domain"),
        )

Run a Transform

ob run -T '{"label": "email", "version": "1.0.0", "transform": "extract_domain", "data": {"email": "user@example.com"}}'

Documentation

Guide Description
Getting Started Installation, project setup, and first plugin
Plugins & Entities Defining entities with the Plugin class
Transforms Creating transforms with the @transform decorator
Elements Input and display elements for entity forms
Field Types Semantic types for fields and type-based matching
Settings Transform configuration and persistence
CLI Reference Command-line interface documentation
API Reference Complete API documentation

Key Concepts

Plugins & Entities

Every node type in the graph is defined as a Plugin subclass. Plugins are automatically registered when defined:

class IPAddress(Plugin):
    version = "1.0.0"
    label = "IP Address"
    elements = [TextInput(label="IP", field_type=FieldType.IP_ADDRESS)]

Transforms

Transforms operate on entities to produce new entities. They target specific entity versions:

@transform(target="ip_address@>=1.0.0", label="GeoIP Lookup", deps=["geoip2"])
async def geoip_lookup(entity):
    # Transform logic
    return Entity(data=Location.blueprint(city="..."))

Result Types

Transforms return Entity, Edge, File, or Subgraph objects:

return Entity(
    data=TargetEntity.blueprint(field="value"),
    edge=Edge(label="discovered", color="#22C55E"),
    files=[File(path="/tmp/report.pdf")],
)

Project Structure

For plugin development and registry submissions, organize your code as:

my-plugins-repo/
├── entities/
│   ├── email.py
│   ├── domain.py
│   └── ip_address.py
└── transforms/
    ├── email_transforms.py
    ├── domain_transforms.py
    ├── network_traceroute_transform.py
    └── network_transforms.py

Load plugins via:

from osintbuddy import load_plugins_fs
load_plugins_fs("/path/to/my-plugins", "my_plugins")

CLI Commands

# List entities and transforms
ob ls entities
ob ls transforms -L email

# Run a transform
ob transform '{"label": "email", "version": "1.0.0", "transform": "to_domain", "data": {...}}'

# Get entity blueprints
ob blueprints -L email

# Initialize a new plugins project
ob init

# Sync manifest and README metadata after repo changes
ob sync

# Compile JSON entity to Python
ob compile entity.json -O entity.py

Requirements

  • Python 3.13+

License

MIT License, see LICENSE for details.

Links

Metadata

Release files for osintbuddy 2.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for osintbuddy 2.1.0
File Size Uploaded
osintbuddy-2.1.0.tar.gz 61.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for osintbuddy 2.1.0
File Interpreter ABI Platform
osintbuddy-2.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 130.4 kB

Release files / osintbuddy-2.1.0.tar.gz

Download URL osintbuddy-2.1.0.tar.gz
Size 61.4 kB
Tags Source
SHA-256 checksum
How to use checksums
6ad9d2685c00c47db4f599604b560502c81229b0a50c4e2371eee6fc1016f87c
BLAKE2b-256 checksum
How to use checksums
ae1e8853a2776854e5dbd37bd9fe2aad32c634d21516d5577dc510f5e50c66c2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 9, 2026.

Transparency log

Release files / osintbuddy-2.1.0-py3-none-any.whl

Download URL osintbuddy-2.1.0-py3-none-any.whl
Size 69.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9e37e05ac446a0e39d306f2d6e86524ce755541482ca95d844932035625d01c7
BLAKE2b-256 checksum
How to use checksums
37b6ee8cae388217f09c9577ed4347ce0846e24cd6041afff74bb07988ad6edd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 9, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2.1.0 This release

2 release files

2.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page