# Ignition 8.3: Building a custom tag historian module

**URL:** <https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725>\
**Category:** 3rd Party Modules\
**Tags:** ignition83, perspective\
**Created:** [January 10, 2025, 2:36pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725 "2025-01-10T14:36:30Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![louagejasper](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/louagejasper/32/86311_2.png) [@louagejasper](https://forum.inductiveautomation.com/u/louagejasper)\
**Post date:** [January 10, 2025, 2:36pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/1 "2025-01-10T14:36:30Z")

</div>

Hi all,

There is an upcoming historian in Belgium, called [Factry](https://www.factry.io/), that is looking to build an Ignition historian module, possibly with our help. If we build it, we plan to build it open source, so others can learn from it and contribute to it.

I suggested waiting for Ignition 8.3 since it’s just around the corner. The new in-historian aggregation option in 8.3 could significantly strengthen the use case for such a module.

#### Seeking Contributions and Advice

We’d love some help building this module! We plan to ask questions here and welcome contributions to the code from the community. Resources like [this forum post](https://forum.inductiveautomation.com/t/i-am-looking-for-a-tutor-for-module-development/55030/7) are already incredibly helpful and have given us a solid starting point, and we have a little experience from when we build [our branching component](https://forum.inductiveautomation.com/t/perspective-branching-component-by-mustry-solutions/72101).

* * *

### Key Questions We Have:

#### 1. Historian Support in 8.3

- It seems the Ignition 8.3 historian will **initially support only QuestDB** , with additional historian connections left for us to build.
- Will there be any **examples or documentation** on building these connections?
- Might the QuestDB integration be **open-sourced**? If yes, this could save us a lot of time and effort.
- If not, would [this module](https://github.com/IgnitionModuleDevelopmentCommunity/simpletaghistoryprovider) (built for 7.9) be of any use? It's probably a big stretch, but it’s the only resource I’ve found so far where a history provider is being build.

#### 2. Using the Ignition 8.3 API Docs

- I found the [API documentation for Ignition 8.3](https://github.com/inductiveautomation/ignition-sdk-examples/wiki/Javadocs-&-Notable-API-Changes), but it’s quite extensive.
- Is this **everything needed** to build the module?
- Where should we **start** , and how can we ensure we’re following best practices during development?

* * *

Any advice, examples, or tips would be greatly appreciated.  
Looking forward to your thoughts! 😊

---

<div class="post-metadata">

**Author:** ![michael.flagler](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/michael.flagler/32/26272_2.png) [@michael.flagler](https://forum.inductiveautomation.com/u/michael.flagler)\
**Post date:** [January 10, 2025, 3:31pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/2 "2025-01-10T15:31:34Z")

</div>

I very highly doubt they will open source the QuestDB code. I'm also guessing current/existing historian options of using standard databases will not go away.

Others will have to chime in on the other questions.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [January 10, 2025, 4:37pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/3 "2025-01-10T16:37:27Z")

</div>

> [@louagejasper](#):
>
> - Will there be any **examples or documentation** on building these connections?

Eventually yes, but probably not in the short-to-medium term. As in, I wouldn't rely on examples being available for at least six months.

> [@louagejasper](#):
>
> - Might the QuestDB integration be **open-sourced**? If yes, this could save us a lot of time and effort.

No.

> [@louagejasper](#):
>
> - If not, would [this module](https://github.com/IgnitionModuleDevelopmentCommunity/simpletaghistoryprovider) (albeit for 7.9) be of any use? It's probably a big stretch, but it’s the only resource I’ve found so far where a history provider is being build.

Probably not as helpful as you'd like it to be. The core concepts are similar in _very_ broad strokes, but all of the APIs will be completely different. That example would probably help to make an **8.1** compatible historian, but won't help with 8.3's concepts.

> [@louagejasper](#):
>
> - Is this **everything needed** to build the module?

No. The Javadocs are useful reference material but you won't actually be able to build a module until public beta begins and you have access to the SDK to compile against.

> [@louagejasper](#):
>
> - Where should we **start** , and how can we ensure we’re following best practices during development?

This is pretty much too open-ended of a question to answer. The bare minimum starting point would be a working module example that implements a `GatewayHook`. I'd recommend Gradle as a build system, not out of any particular love for Gradle but because it's where all of our first-party developer time is going. Then you "just" have to implement the historian APIs to hook into the rest of the system. You're, at minimum, going to have to understand our new gateway configuration API, including the new way 'extension points' (in your case, additional historian provider types) are set up, and then the actual historian API itself.  
As you get further along, you could talk with our Sales Engineering department, who might have resources to help talk you through more specific implementation details; devs like Kevin H and myself are on the forums but only do _public_ help, pro-bono, very explicitly, and neither of us are really experts in the new historian.

---

<div class="post-metadata">

**Author:** ![Gabor\_Monostori](https://avatars.discourse-cdn.com/v4/letter/g/74df32/32.png) [@Gabor\_Monostori](https://forum.inductiveautomation.com/u/Gabor_Monostori)\
**Post date:** [October 28, 2025, 10:54am UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/4 "2025-10-28T10:54:17Z")

</div>

Hi all,

I’m a colleague of Jasper, and I’m checking in to see if it’s time to move forward with implementing the custom historian module for Ignition 8.3, now that about ten months have passed.

I tried compiling some code based on the 8.3 documentation, but during ./gradlew build I found the following packages missing from SDK 8.3.1:  
• com.inductiveautomation.historian.gateway.api  
• com.inductiveautomation.historian.gateway.api.config  
• com.inductiveautomation.historian.gateway.api.query  
• com.inductiveautomation.historian.gateway.api.storage  
• com.inductiveautomation.historian.gateway.api.paths

This seems to be a blocking issue. Do you have any suggestions on how to proceed, or should we continue waiting?

Best,  
Gabor

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [October 28, 2025, 3:51pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/5 "2025-10-28T15:51:31Z")

</div>

Historian related packages are in a separate artifact, because the historian is now a dedicated module and (as much as possible) has been pulled out of the core platform.  
You need to add the historian dependency to your build system, as in:

> <https://github.com/inductiveautomation/ignition-sdk-examples/blob/f9aa673775043d4dafb0eddcc77981645528a2a2/slack-alarm-notification/slack-notification-gateway/pom.xml#L39-L45>

> <https://github.com/inductiveautomation/ignition-sdk-examples/blob/f9aa673775043d4dafb0eddcc77981645528a2a2/perspective-component-minimal/gradle/libs.versions.toml#L16-L18>

The relevant artifact IDs are `historian-common` and `historian-gateway`.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [October 28, 2025, 5:23pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/6 "2025-10-28T17:23:51Z")

</div>

Try to stick to just the classes available in the gateway `api` packages... we're not correctly separating and publishing the historian SDK components right now. This should get cleaned up a bit over the next release or two.

---

<div class="post-metadata">

**Author:** ![Gabor\_Monostori](https://avatars.discourse-cdn.com/v4/letter/g/74df32/32.png) [@Gabor\_Monostori](https://forum.inductiveautomation.com/u/Gabor_Monostori)\
**Post date:** [October 29, 2025, 9:38am UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/7 "2025-10-29T09:38:57Z")

</div>

Thank you for your quick responses.

However, I’m a bit confused. Kevin, if I understand correctly, your suggestion is to keep using the old API until the new one is cleaned up. That would mean anything we implement now would soon need to be redone.

We’ve been waiting for the new API because we want to avoid duplicating work. But if “soon” isn’t actually that soon—or if the old API will still be supported for a while—it might make sense to continue with the current one.

Could you please clarify the expected timelines? For example, will the old API be deprecated within a year? And do you expect the new one to be stable within the next few months?

Thanks in advance!

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [October 29, 2025, 11:29am UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/8 "2025-10-29T11:29:07Z")

</div>

Use the new API but don't stray outside these packages:

- com.inductiveautomation.historian.gateway.api
- com.inductiveautomation.historian.common.model

The artifact being published hasn't been properly split into API and implementation, so there's stuff in there that is not part of the API, not public, will be removed, and never should have been there.

> [@Gabor\_Monostori](#):
>
> I tried compiling some code based on the 8.3 documentation, but during ./gradlew build I found the following packages missing from SDK 8.3.1:  
> • com.inductiveautomation.historian.gateway.api  
> • com.inductiveautomation.historian.gateway.api.config  
> • com.inductiveautomation.historian.gateway.api.query  
> • com.inductiveautomation.historian.gateway.api.storage  
> • com.inductiveautomation.historian.gateway.api.paths

These all exist, so perhaps you don't have your build system / dependencies squared away yet.

---

<div class="post-metadata">

**Author:** ![Gabor\_Monostori](https://avatars.discourse-cdn.com/v4/letter/g/74df32/32.png) [@Gabor\_Monostori](https://forum.inductiveautomation.com/u/Gabor_Monostori)\
**Post date:** [October 29, 2025, 11:59am UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/10 "2025-10-29T11:59:00Z")

</div>

That makes perfect sense now, thanks.

I’ll give it a try shortly and see how far I can get.

---

<div class="post-metadata">

**Author:** ![Gabor\_Monostori](https://avatars.discourse-cdn.com/v4/letter/g/74df32/32.png) [@Gabor\_Monostori](https://forum.inductiveautomation.com/u/Gabor_Monostori)\
**Post date:** [October 31, 2025, 8:10am UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/11 "2025-10-31T08:10:15Z")

</div>

Hi there,

I’ve managed to implement several historian components (inheriting from AbstractHistorian, AbstractQueryEngine, and AbstractStorageEngine). They compile and load without errors, and my module can create and start historian instances programmatically.

At the moment, I’m only depending on com.inductiveautomation.historian.gateway and common as you suggested.

However, I’m blocked on getting our historian type to appear in the Gateway UI dropdown at **Config → Services → Historians → Create New Historian Profile**.

What I’ve tried:

1. Creating a HistorianExtensionPoint implementation and attempting to register it via HistorianManagerImpl.getExtensionPointCollection(). The returned collection appears immutable.

2. Adding a Java SPI service file at  
META-INF/services/com.inductiveautomation.historian.gateway.api.HistorianExtensionPoint.

3. Reviewing StandardHistorianCollection and noticing it uses a hard-coded static list of extension points.

**Obviously my question now:**

What’s the proper way for third-party modules to register custom historian types so they show up in the Gateway UI dropdown? Is there a specific API, configuration, or module hook pattern we should use for extension-point registration in Ignition 8.3.1?

Any guidance would be greatly appreciated!

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [October 31, 2025, 11:35am UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/12 "2025-10-31T11:35:05Z")

</div>

In 8.3 all ExtensionPoints are registered by returning them from `GatewayModuleHook::getExtensionPoints`.

---

<div class="post-metadata">

**Author:** ![Gabor\_Monostori](https://avatars.discourse-cdn.com/v4/letter/g/74df32/32.png) [@Gabor\_Monostori](https://forum.inductiveautomation.com/u/Gabor_Monostori)\
**Post date:** [October 31, 2025, 12:04pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/13 "2025-10-31T12:04:55Z")

</div>

> [@Kevin.Herron](#):
>
> GatewayModuleHook::getExtensionPoints

That was it! Great, thanks!

---

<div class="post-metadata">

**Author:** ![Gabor\_Monostori](https://avatars.discourse-cdn.com/v4/letter/g/74df32/32.png) [@Gabor\_Monostori](https://forum.inductiveautomation.com/u/Gabor_Monostori)\
**Post date:** [November 2, 2025, 10:26pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/14 "2025-11-02T22:26:54Z")

</div>

Another problem from me — probably not the last one.

As I mentioned earlier, your advice solved the issue with our historian not appearing in the Create Historian dialog. Now that it shows up and I can click the Next button, I get the following message:

Configure \*\*¿\*\*Factry Historian?  
Web UI Component type not found

If I’m not mistaken, this page used to be generated based on the settings in earlier Ignition versions. However, as the message suggests, it now seems that a Web UI component needs to be defined somewhere.

Is this documented anywhere? I haven’t been able to find any reference to it.

By the way, what about the question marks ¿?. They suggest that something still isn’t quite right here.

---

<div class="post-metadata">

**Author:** ![David\_Stone](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/david_stone/32/79749_2.png) [@David\_Stone](https://forum.inductiveautomation.com/u/David_Stone)\
**Post date:** [November 2, 2025, 11:03pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/15 "2025-11-02T23:03:46Z")

</div>

> [@Gabor\_Monostori](#):
>
> By the way, what about the question marks ¿?. They suggest that something still isn’t quite right here.

This means your resources bundle does not have descriptions for the element normally.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [November 2, 2025, 11:23pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/16 "2025-11-02T23:23:38Z")

</div>

In your ExtensionPoint implementation, you'll want to override `getWebUiComponent` with something like this: [ignition-sdk-examples/opc-ua-device/opc-ua-device-gateway/src/main/java/com/inductiveautomation/ignition/examples/tagdriver/ExampleDeviceExtensionPoint.java at f9aa673775043d4dafb0eddcc77981645528a2a2 · inductiveautomation/ignition-sdk-examples · GitHub](https://github.com/inductiveautomation/ignition-sdk-examples/blob/f9aa673775043d4dafb0eddcc77981645528a2a2/opc-ua-device/opc-ua-device-gateway/src/main/java/com/inductiveautomation/ignition/examples/tagdriver/ExampleDeviceExtensionPoint.java#L33-L43)

```python
  @Override
  public Optional<WebUiComponent> getWebUiComponent(ComponentType type) {
    return Optional.of(
        new ExtensionPointResourceForm(
            DeviceExtensionPoint.DEVICE_RESOURCE_TYPE,
            "Device Connection",
            TYPE_ID,
            SchemaUtil.fromType(DeviceProfileConfig.class),
            SchemaUtil.fromType(ExampleDeviceConfig.class),
            Set.of()));
  }

```

The key here is the `ExtensionPointResourceForm`, which is what any extension point can use to get the free config page for their annotated config objects.

The resource type and config classes will be specific to the historian and your implementation; not sure what they are supposed to be off hand.

---

<div class="post-metadata">

**Author:** ![Allen\_Miller](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/allen_miller/32/43816_2.png) [@Allen\_Miller](https://forum.inductiveautomation.com/u/Allen_Miller)\
**Post date:** [November 19, 2025, 5:42pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/17 "2025-11-19T17:42:21Z")

</div>

Thanks for the great discussion to everyone in this thread!

Just to spell it out in case anyone else is working with the historian API, I had to add these dependencies (I'm using Maven):

```xml
-- Common POM
<dependency>
    <groupId>com.inductiveautomation.ignitionsdk</groupId>
    <artifactId>historian-common</artifactId>
    <version>${ignition-sdk-version}</version>
    <scope>provided</scope>
    <type>pom</type>
</dependency>
-- Gateway POM
<dependency>
    <groupId>com.inductiveautomation.ignitionsdk</groupId>
    <artifactId>historian-gateway</artifactId>
    <version>${ignition-sdk-version}</version>
    <scope>provided</scope>
    <type>pom</type>
    <exclusions>
        <exclusion>
            <groupId>com.inductiveautomation.historian</groupId>
            <artifactId>web-ui</artifactId>
        </exclusion>
    </exclusions>
</dependency>

```

Additionally, I had to add a module dependency on the historian module:

```xml
-- Build POM
<depend>
    <scope>G</scope>
    <moduleId>com.inductiveautomation.historian</moduleId>
</depend>

```

Which adds this line to `module.xml`:

```xml
<depends scope="G">com.inductiveautomation.historian</depends>

```

That said, I'm not quite following what to return in `GatewayModuleHook::getExtensionPoints`. In the SDK examples repo, I see classes that reference an existing extension point class:

- [SecretProviderType](https://files.inductiveautomation.com/sdk/javadoc/ignition83/8.3.1/com/inductiveautomation/ignition/gateway/secrets/SecretProviderType.html) for the [MongoDB Secrets Provider](https://github.com/inductiveautomation/ignition-sdk-examples/blob/92813eb6e9372704926eebca870e3e48b607e487/secret-provider/secret-provider-gateway/src/main/java/com/inductiveautomation/ignition/examples/secretprovider/mongodb/MongoDbSecretProviderExtensionPoint.java#L15)
- [DeviceExtensionPoint](https://files.inductiveautomation.com/sdk/javadoc/ignition83/8.3.1/com/inductiveautomation/ignition/gateway/opcua/server/api/DeviceExtensionPoint.html) for the [OPC UA device](https://github.com/inductiveautomation/ignition-sdk-examples/blob/92813eb6e9372704926eebca870e3e48b607e487/opc-ua-device/opc-ua-device-gateway/src/main/java/com/inductiveautomation/ignition/examples/tagdriver/ExampleDeviceExtensionPoint.java#L14C50-L14C70)
- [AlarmNotificationProfileExtensionPoint](https://files.inductiveautomation.com/sdk/javadoc/ignition83/8.3.1/com/inductiveautomation/ignition/alarming/notification/AlarmNotificationProfileExtensionPoint.html) for the [Slack alarm notification](https://github.com/inductiveautomation/ignition-sdk-examples/blob/92813eb6e9372704926eebca870e3e48b607e487/slack-alarm-notification/slack-notification-gateway/src/main/java/io/ia/ignition/sdk/examples/slack/profile/SlackNotificationExtensionPoint.java#L28)
- [UserSourceExtensionPoint](https://files.inductiveautomation.com/sdk/javadoc/ignition83/8.3.1/com/inductiveautomation/ignition/gateway/user/UserSourceExtensionPoint.html) for the [User Source Profile](https://github.com/inductiveautomation/ignition-sdk-examples/blob/92813eb6e9372704926eebca870e3e48b607e487/user-source-profile/user-source-gateway/src/main/java/com/inductiveautomation/ignition/examples/usersource/mongodb/MongoDbUserSourceExtensionPoint.java#L21)

But I don't see any historian extension point classes listed as implementing/subclasses on [ExtensionPoint](https://files.inductiveautomation.com/sdk/javadoc/ignition83/8.3.1/com/inductiveautomation/ignition/gateway/config/ExtensionPoint.html) or [AbstractExtensionPoint](https://files.inductiveautomation.com/sdk/javadoc/ignition83/8.3.1/com/inductiveautomation/ignition/gateway/config/AbstractExtensionPoint.html). Will I need to assemble a custom extension point with a specific [ResourceType](https://files.inductiveautomation.com/sdk/javadoc/ignition83/8.3.1/com/inductiveautomation/ignition/gateway/config/ExtensionPoint.html#resourceType())?

Thanks for the help!

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [November 19, 2025, 5:51pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/18 "2025-11-19T17:51:56Z")

</div>

The extension point is `com.inductiveautomation.historian.gateway.api.HistorianExtensionPoint`, which is provided by the historian module. It looks like we're going to rewrite it from Kotlin to Java no sooner than 8.3.3, but in theory that in particular should be a binary compatible change if you were to start working on things now.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [November 19, 2025, 6:01pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/19 "2025-11-19T18:01:56Z")

</div>

> [@paul-griffith](#):
>
> rewrite it from Kotlin to Java

Heh. So I'm not the only one not happy with Kotlin?

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [November 19, 2025, 6:05pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/20 "2025-11-19T18:05:29Z")

</div>

You, some internal folks, and the `javadoc` tool aren't happy with Kotlin. Most of the rest of us are quite happy with it 😃

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [November 19, 2025, 6:07pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725/21 "2025-11-19T18:07:37Z")

</div>

> [@pturmel](#):
>
> So I'm not the only one not happy with Kotlin?

It's just a problem for us in the API because our build system can't generate kdocs and merge them with the javadoc, so any API class/interface written in Kotlin is "invisible" to the SDK users.

[Next page](https://forum.inductiveautomation.com/t/ignition-8-3-building-a-custom-tag-historian-module/100725.md?page=2)
