# Tips for Getting Started with Custom Modules

**URL:** <https://forum.inductiveautomation.com/t/tips-for-getting-started-with-custom-modules/115305>\
**Category:** Module Development\
**Tags:** ignition83, perspective\
**Created:** [April 29, 2026, 2:36pm UTC](https://forum.inductiveautomation.com/t/tips-for-getting-started-with-custom-modules/115305 "2026-04-29T14:36:38Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![travisaggiebrown](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/travisaggiebrown/32/85824_2.png) [@travisaggiebrown](https://forum.inductiveautomation.com/u/travisaggiebrown)\
**Post date:** [April 29, 2026, 2:36pm UTC](https://forum.inductiveautomation.com/t/tips-for-getting-started-with-custom-modules/115305/1 "2026-04-29T14:36:39Z")

</div>

I'm trying to get started trying to make a custom module so that I can make custom perspective components. I've watched the Inductive University videos and read the ignition SDK Programmers Guide as well as looking at the examples.

However, with all the extension and inheritance of files I feel I'm more confused than I began. it doesn't look that complicated I just don't feel like I understand the flow of the system. I've been reading through the Javadoc's and that's helped some, but I was hoping someone could help me better grasp the concepts or point me to some helpful information?

is there a way to look at the code for some of the existing components in perspective? are there any repositories that have good examples of custom components? I tried to look at the embr github code from Musson but that was confusing to me as well due to the complexity of it compared to the ignition sdk examples. if it's a complete fever dreams to start with making custom components is there somewhere I should start?

---

<div class="post-metadata">

**Author:** ![bmusson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bmusson/32/87530_2.png) [@bmusson](https://forum.inductiveautomation.com/u/bmusson)\
**Post date:** [April 29, 2026, 2:44pm UTC](https://forum.inductiveautomation.com/t/tips-for-getting-started-with-custom-modules/115305/2 "2026-04-29T14:44:17Z")

</div>

> [@travisaggiebrown](#):
>
> is there a way to look at the code for some of the existing props in perspective? are there any repositories that have good examples of custom props

What do you mean by custom props?  
Do you mean the properties that are shown for a component in designer, in the property tree?

---

<div class="post-metadata">

**Author:** ![travisaggiebrown](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/travisaggiebrown/32/85824_2.png) [@travisaggiebrown](https://forum.inductiveautomation.com/u/travisaggiebrown)\
**Post date:** [April 29, 2026, 2:48pm UTC](https://forum.inductiveautomation.com/t/tips-for-getting-started-with-custom-modules/115305/3 "2026-04-29T14:48:00Z")

</div>

No, I guess props is the wrong word entirely. I mean the components that are shown in the component pallet in perspective that you can drag onto the page.

---

<div class="post-metadata">

**Author:** ![bmusson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bmusson/32/87530_2.png) [@bmusson](https://forum.inductiveautomation.com/u/bmusson)\
**Post date:** [April 29, 2026, 3:01pm UTC](https://forum.inductiveautomation.com/t/tips-for-getting-started-with-custom-modules/115305/4 "2026-04-29T15:01:27Z")

</div>

Yeah, "props" is very specific concept in Perspective.

Have you checked out IA's example modules?

> **[ignition-sdk-examples/perspective-component at ignition-8.3 ·...](https://github.com/inductiveautomation/ignition-sdk-examples/tree/ignition-8.3/perspective-component)**
>
> ignition-8.3/perspective-component

I also have my own example:

1. It's primarily a monorepo example, which makes it more complicated. However, most of the complexity is hidden away in the build conventions and "just works".
2. The build process for the `web` resources is much simpler (WebPack = 🤮).

> **[ignition-module-monorepo-example/modules/example-perspective at main ·...](https://github.com/benmusson/ignition-module-monorepo-example/tree/main/modules/example-perspective)**
>
> main/modules/example-perspective

---

<div class="post-metadata">

**Author:** ![travisaggiebrown](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/travisaggiebrown/32/85824_2.png) [@travisaggiebrown](https://forum.inductiveautomation.com/u/travisaggiebrown)\
**Post date:** [April 29, 2026, 3:37pm UTC](https://forum.inductiveautomation.com/t/tips-for-getting-started-with-custom-modules/115305/5 "2026-04-29T15:37:55Z")

</div>

yeah, I did look at the example I was unaware of your examples. I've been overlooking it and want to make sure my guestimations are correct, so you need 4 files for defining the component.

#1 the Json file that acts as the properties for the component which is props.json in your example.

#2 the JS or TS that defines the browser side which is the cool-button.tsx in your example.

#3 the module metadata and the set of browser resources that point to the JS or TS file after it's been mounted which is Meta.kt in your example.

#4 the file that creates the Descriptor that is called by the hook to register the component? which is CoolButton.kt in your example

then in your hooks you just have it be registered on startup and removed on shutdown

am i missing something or is that most of the meat and potatoes of it?

---

<div class="post-metadata">

**Author:** ![bmusson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bmusson/32/87530_2.png) [@bmusson](https://forum.inductiveautomation.com/u/bmusson)\
**Post date:** [April 29, 2026, 5:43pm UTC](https://forum.inductiveautomation.com/t/tips-for-getting-started-with-custom-modules/115305/6 "2026-04-29T17:43:18Z")

</div>

That’s pretty much it.

The bare minimum required to have a working Perspective component is:

1. Make a client-side `ComponentMeta`, and register it.
2. Make a `ComponentDescriptor`, and register it in the both the Gateway and the Designer.
3. Mount your web resources so that the client can access them.

Your `ComponentDescriptor` is where you can set up the property schema.

---

<div class="post-metadata">

**Author:** ![travisaggiebrown](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/travisaggiebrown/32/85824_2.png) [@travisaggiebrown](https://forum.inductiveautomation.com/u/travisaggiebrown)\
**Post date:** [May 1, 2026, 5:29pm UTC](https://forum.inductiveautomation.com/t/tips-for-getting-started-with-custom-modules/115305/7 "2026-05-01T17:29:27Z")

</div>

thanks for the help I may have pulled a couple hairs out, but I managed to get it working finally. I don't completely understand how everything works but it works so I can't complain.
