Adds an opt-in entry-point discovery hook so external packages can ship Flowsint enrichers and types from their own top-level package, without vendoring them inside flowsint_enrichers/ or flowsint_types/.
load_all_enrichers() and load_all_types() now also iterate the flowsint.enrichers and flowsint.types entry-point groups and import the referenced module, firing the existing @flowsint_enricher / @flowsint_type decorators into the global registries.
Why
Today discovery is a filesystem walk of a single package directory, so the only way to add enrichers/types is to edit this repo. This hook lets people maintain private or domain-specific packs (e.g. country-specific OSINT sources) as separate, independently-versioned distributions that only need to be installed alongside Flowsint.
The referenced module is imported once; its __init__ imports the submodules that define the decorated classes.
Notes
Additive and backwards-compatible: with no third-party packs installed, behavior is unchanged.
Plugin import failures are caught, logged to stderr, and skipped — matching the existing in-tree walk behavior.
Stays idempotent via the existing _enrichers_loaded / _types_loaded guards.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
## 📋 Pull Request Information
**Original PR:** https://github.com/reconurge/flowsint/pull/157
**Author:** [@thau0x01](https://github.com/thau0x01)
**Created:** 6/3/2026
**Status:** 🔄 Open
**Base:** `main` ← **Head:** `feat/enricher-type-plugin-discovery`
---
### 📝 Commits (2)
- [`d770772`](https://github.com/reconurge/flowsint/commit/d7707722f70c8660e6edc9da80bf409a7c7a3f3b) feat(registry): discover third-party enricher/type packs via entry points
- [`17b3d82`](https://github.com/reconurge/flowsint/commit/17b3d823936cb206b4e780286733c067900aa0a2) docs: document external enricher/type packs via entry points
### 📊 Changes
**5 files changed** (+463 additions, -0 deletions)
<details>
<summary>View changed files</summary>
➕ `docs/developers/external-packs.mdx` (+391 -0)
📝 `docs/developers/managing-enrichers.mdx` (+2 -0)
📝 `docs/developers/managing-types.mdx` (+2 -0)
📝 `flowsint-enrichers/src/flowsint_enrichers/registry.py` (+35 -0)
📝 `flowsint-types/src/flowsint_types/registry.py` (+33 -0)
</details>
### 📄 Description
## What
Adds an opt-in entry-point discovery hook so external packages can ship Flowsint enrichers and types from their own top-level package, without vendoring them inside `flowsint_enrichers/` or `flowsint_types/`.
`load_all_enrichers()` and `load_all_types()` now also iterate the `flowsint.enrichers` and `flowsint.types` entry-point groups and import the referenced module, firing the existing `@flowsint_enricher` / `@flowsint_type` decorators into the global registries.
## Why
Today discovery is a filesystem walk of a single package directory, so the only way to add enrichers/types is to edit this repo. This hook lets people maintain private or domain-specific packs (e.g. country-specific OSINT sources) as separate, independently-versioned distributions that only need to be installed alongside Flowsint.
## How a pack registers
```toml
[project.entry-points."flowsint.enrichers"]
my_pack = "my_pack.enrichers"
[project.entry-points."flowsint.types"]
my_pack = "my_pack.types"
```
The referenced module is imported once; its `__init__` imports the submodules that define the decorated classes.
## Notes
- Additive and backwards-compatible: with no third-party packs installed, behavior is unchanged.
- Plugin import failures are caught, logged to stderr, and skipped — matching the existing in-tree walk behavior.
- Stays idempotent via the existing `_enrichers_loaded` / `_types_loaded` guards.
---
<sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/reconurge/flowsint/pull/157
Author: @thau0x01
Created: 6/3/2026
Status: 🔄 Open
Base:
main← Head:feat/enricher-type-plugin-discovery📝 Commits (2)
d770772feat(registry): discover third-party enricher/type packs via entry points17b3d82docs: document external enricher/type packs via entry points📊 Changes
5 files changed (+463 additions, -0 deletions)
View changed files
➕
docs/developers/external-packs.mdx(+391 -0)📝
docs/developers/managing-enrichers.mdx(+2 -0)📝
docs/developers/managing-types.mdx(+2 -0)📝
flowsint-enrichers/src/flowsint_enrichers/registry.py(+35 -0)📝
flowsint-types/src/flowsint_types/registry.py(+33 -0)📄 Description
What
Adds an opt-in entry-point discovery hook so external packages can ship Flowsint enrichers and types from their own top-level package, without vendoring them inside
flowsint_enrichers/orflowsint_types/.load_all_enrichers()andload_all_types()now also iterate theflowsint.enrichersandflowsint.typesentry-point groups and import the referenced module, firing the existing@flowsint_enricher/@flowsint_typedecorators into the global registries.Why
Today discovery is a filesystem walk of a single package directory, so the only way to add enrichers/types is to edit this repo. This hook lets people maintain private or domain-specific packs (e.g. country-specific OSINT sources) as separate, independently-versioned distributions that only need to be installed alongside Flowsint.
How a pack registers
The referenced module is imported once; its
__init__imports the submodules that define the decorated classes.Notes
_enrichers_loaded/_types_loadedguards.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.