Skip to main content

The Omoika plugins framework for graph-based information analysis and offline local-first investigative workflows.

Project description

Introducing the OMOIKA framework

Welcome to the OMOIKA project where you can connect, combine, and get insight from unstructured and public data as results that can be explored step-by-step. An easy-to-use plugin system allows any developer to quickly integrate new data sources so you can focus on discovering, interacting, and visualizing what's important to you

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.


📼 Click here to watch the OMOIKA video demo...

demo.mp4


The OMOIKA Plugins Framework

PyPI version Python 3.13+ License: MIT hits

This is the plugin framework for OMOIKA, a graph-based OSINT platform for recon, OSINT investigations, link analysis, and more. Offline. Local-first workflows. No cloud dependency required.

Overview

OMOIKA'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 omoika[all]

For development:

git clone https://github.com/omoika-institute/framework.git
cd framework/
pip install -e ".[dev]"

Quick Start

Define an Entity

from omoika import Plugin
from omoika.elements import TextInput, CopyText
from omoika.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 omoika 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

omoika 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 omoika import load_plugins_fs
load_plugins_fs("/path/to/my-plugins", "my_plugins")

CLI Commands

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

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

# Get entity blueprints
omoika blueprints -L email

# Initialize a new plugins project
omoika init

# Sync manifest and README metadata after repo changes
omoika sync

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

Requirements

  • Python 3.13+

License

MIT License, see LICENSE for details.

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

omoika-2.1.4.tar.gz (64.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

omoika-2.1.4-py3-none-any.whl (70.6 kB view details)

Uploaded Python 3

File details

Details for the file omoika-2.1.4.tar.gz.

File metadata

  • Download URL: omoika-2.1.4.tar.gz
  • Upload date:
  • Size: 64.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for omoika-2.1.4.tar.gz
Algorithm Hash digest
SHA256 9bddf68bdc8ae85c45d45e7f9939287b907dafeebb25d5f0be296dca7a0402b1
MD5 d38e3112c309808fab65286979abe00b
BLAKE2b-256 bf324339576fde3634fe31286e85a49b976be30356b56081f71a1f96f623069f

See more details on using hashes here.

Provenance

The following attestation bundles were made for omoika-2.1.4.tar.gz:

Publisher: publish.yml on omoika-institute/framework

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file omoika-2.1.4-py3-none-any.whl.

File metadata

  • Download URL: omoika-2.1.4-py3-none-any.whl
  • Upload date:
  • Size: 70.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for omoika-2.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 5670c0312494e65189b990bd1e5d5f3e2be2abfbab47782f6433714682eef09b
MD5 77c3a63fc2dbba04a87e83148568d9a4
BLAKE2b-256 b8a4c898dcc3370633e9171692b0f52f479ba01c68b396dbed74e82f47cbbee3

See more details on using hashes here.

Provenance

The following attestation bundles were made for omoika-2.1.4-py3-none-any.whl:

Publisher: publish.yml on omoika-institute/framework

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page