# What external tools do you use for Ignition development, and why?

**URL:** <https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759>\
**Category:** Ignition\
**Created:** [July 25, 2024, 5:07pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759 "2024-07-25T17:07:22Z")\
**Posts on this page:** 20\
**Page:** 3

<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:** [March 27, 2025, 7:56pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/41 "2025-03-27T19:56:29Z")

</div>

> [@Kevin.Herron](#):
>
> upgrade path / backwards compatibility

Nightmare. The breakage would be extreme.

---

<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:** [March 27, 2025, 7:57pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/42 "2025-03-27T19:57:41Z")

</div>

Yeah, complete dead end. There's zero chance. Any new scripting engine would only be usable on new projects, or even gateway-wide on new installs. No chance of upgrades, no chance of interop.

---

<div class="post-metadata">

**Author:** ![jrusso](https://avatars.discourse-cdn.com/v4/letter/j/c0e974/32.png) [@jrusso](https://forum.inductiveautomation.com/u/jrusso)\
**Post date:** [March 27, 2025, 9:41pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/43 "2025-03-27T21:41:58Z")

</div>

> 30 engineers \* 3 projects \* 5-10 gateways per projects and we're looking at managing ~300-600 ignition gateways _all at one time... **per day** _

Are you actually using 5-10 gateways a project? Are you just working on a massive scale or is there something I'm missing here? Maybe a ton of tags with separate IO servers, I'm curious

---

<div class="post-metadata">

**Author:** ![ryan.white](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ryan.white/32/73193_2.png) [@ryan.white](https://forum.inductiveautomation.com/u/ryan.white)\
**Post date:** [March 27, 2025, 9:47pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/44 "2025-03-27T21:47:33Z")

</div>

> [@Kevin.Herron](#):
>
> VS Code plugin

Maybe an Intellij plugin instead? Intellij has a free python plugin that lets it support whatever python version you install. I know nothing of the difficulties of making this work though, so it might not be feasible.

---

<div class="post-metadata">

**Author:** ![Leor\_Fishman](https://avatars.discourse-cdn.com/v4/letter/l/e19adc/32.png) [@Leor\_Fishman](https://forum.inductiveautomation.com/u/Leor_Fishman)\
**Post date:** [March 27, 2025, 10:01pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/45 "2025-03-27T22:01:57Z")

</div>

How much of the scripting would be capturable via transpilation of the underlying python code (if it's stored in text)?

It feels like it should be at least be possible...

---

<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:** [March 27, 2025, 10:03pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/46 "2025-03-27T22:03:07Z")

</div>

Transpiling to another language is irrelevant. The script engine is hopelessly entangled with Jython internals, and so is a lot of user code.

---

<div class="post-metadata">

**Author:** ![Leor\_Fishman](https://avatars.discourse-cdn.com/v4/letter/l/e19adc/32.png) [@Leor\_Fishman](https://forum.inductiveautomation.com/u/Leor_Fishman)\
**Post date:** [March 27, 2025, 10:03pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/47 "2025-03-27T22:03:39Z")

</div>

Ahhhh, i see -- sure, things like system functions etc are Tied to Jython

---

<div class="post-metadata">

**Author:** ![kgamble](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kgamble/32/8019_2.png) [@kgamble](https://forum.inductiveautomation.com/u/kgamble)\
**Post date:** [March 27, 2025, 10:06pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/48 "2025-03-27T22:06:07Z")

</div>

Absolutely, but it depends on the type of application.

Anything from Datacenter projects with dozens of IO gateways per building to enterprise MES applications that are running scaled architectures in the cloud.

For instance, we have an enterprise OEE application that runs elastically scaled frontends, a dedicated pair of middle ends, separate broker, 1 OEE backend per site for ~15 sites and then MQTT brokers on premises publishing data to the cloud. For a dev to run this project it is typically around 7 gateways at a time (to run 2 sites)

In general, we find that licensing is very cheap compared to the development it takes to hyperoptimize a project for scale like this. So easier to just dig in with more gateways and make gateways easier to deploy.

---

<div class="post-metadata">

**Author:** ![kgamble](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kgamble/32/8019_2.png) [@kgamble](https://forum.inductiveautomation.com/u/kgamble)\
**Post date:** [March 27, 2025, 10:08pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/49 "2025-03-27T22:08:14Z")

</div>

This is why my VS Code Extension I have doesn't implement an LSC or anything, and it just does all of the work on the fly to handle any intellisense type recommendations etc.

In general though, I think I will end up building a module that implements an LSP (\*\*_cough_\*\* or @paul-griffith will finally get to it \*\*_cough_\*\*) and then update the vs code extension to work with that instead.

---

<div class="post-metadata">

**Author:** ![hunterdg](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/hunterdg/32/67774_2.png) [@hunterdg](https://forum.inductiveautomation.com/u/hunterdg)\
**Post date:** [March 27, 2025, 10:08pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/50 "2025-03-27T22:08:38Z")

</div>

maybe you can shoot my dream down before I try too hard:

- there’s an exhange resource by corso/@andrew.geiger that allows running Jupyter Notebooks against the gateway.
- vscode “server” can be hosted just like Jupyter
- gateway resources can be accessed from scripting environment (or just via filesystem if local)
- embed locally-hosted vscode server (connected to gateway runtime like the Jupyter resource) in a perspective iframe (or just access it directly)
- ….
- Profit!?

---

<div class="post-metadata">

**Author:** ![andrew.geiger](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/andrew.geiger/32/5219_2.png) [@andrew.geiger](https://forum.inductiveautomation.com/u/andrew.geiger)\
**Post date:** [March 27, 2025, 11:07pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/51 "2025-03-27T23:07:14Z")

</div>

Lots in this thread, so I'll just note the Jupyter kernel is essentially just another scripting execution context in Ignition. So when it's spun up, it jams the desired context into globals and evals what the Jupyter environment hollers at it. There's more to it, but that's kind of the gist. The upside is it gives easy (IMO) near full control over that context.

If you can talk like a Jupyter server, you can talk to the kernel. The protocol isn't terribly involved, but it's basically a souped up REPL - you type commands, Jupyter hollers them at the kernel, the kernel executes the commands, and then the kernel emits replies. The catch is that Jupyter uses ZeroMQ (for now), so if your plugin or environment doesn't natively support that then you'd need to add that to drive the kernel running in Ignition.

But if you add additional handlers in the kernel, you can hook into and extend the kernel for other non-Jupyter commands, if you like. I think it should be as simple as adding another handler.

---

<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:** [March 28, 2025, 4:04pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/52 "2025-03-28T16:04:32Z")

</div>

> [@kgamble](#):
>
> [VS Code](https://code.visualstudio.com): Our teams almost 100% of the time have open VS Code and at least 1 Ignition designer, and VS Code is probably open more than the designer overall. For script editing, terminals for git commands or helper scripts, and reviewing changes in JSON files we have essentially turned VS Code into a pseudo-replacement designer for most things scripting.  
> [Flint for Ignition](https://marketplace.visualstudio.com/items?itemName=Keith-gamble.ignition-flint): This is a custom developed that I made to allow for better use of VS Code to manage multiple Igntition projects. It does things like add auto-complete for project scripts, visualize them in a more standard format, and can integrate with a few modules we've made for triggering project script updates and designer updates from within VS Code.

@kgamble I made a little video to show how to use the vscode stuff. Your resources are gold!  
[https://youtu.be/TFooeDCMe\_Y](https://youtu.be/TFooeDCMe_Y)

[![](https://us1.discourse-cdn.com/inductiveautomation/original/3X/1/a/1aaa79756b5632937017c792917d1cc1e71a35b4.jpeg "How to use VSCode for your Ignition projects!") ](https://www.youtube.com/watch?v=TFooeDCMe_Y)

---

<div class="post-metadata">

**Author:** ![kgamble](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kgamble/32/8019_2.png) [@kgamble](https://forum.inductiveautomation.com/u/kgamble)\
**Post date:** [March 28, 2025, 4:28pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/53 "2025-03-28T16:28:23Z")

</div>

This is better than I could have presented it! Lol, I love it!

I didn't see you mention it, however if you open a VS Code Workspace, you can have VS Code automatically trigger the gateway project scan for you whenever you save project scripts. If you have a `docker-compose.yaml` file for your project, It should attempt to auto-generate the following settings structure in your workspace settings, however if it cant auto-detect it from a docker-compose.yaml you can just add it in yourself.

```json
	"settings": {
        "ignitionFlint.ignitionGateways": [
          {
            "label": "Frontend",
            "address": "https://frontend.localtest.me", 
            "projectPaths": [ #The relative filesystem path to your ignition projects root directory.
              "temp/projects"
            ],
            "updateDesignerOnSave": true,
            "forceUpdateDesigner": true,
            "supportsProjectScanEndpoint": true
          }
        ]
	}

```

---

<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:** [March 28, 2025, 4:47pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/54 "2025-03-28T16:47:02Z")

</div>

I did not realise I could do this! Very nice!

---

<div class="post-metadata">

**Author:** ![jrusso](https://avatars.discourse-cdn.com/v4/letter/j/c0e974/32.png) [@jrusso](https://forum.inductiveautomation.com/u/jrusso)\
**Post date:** [March 28, 2025, 8:41pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/55 "2025-03-28T20:41:22Z")

</div>

Interesting perspective, I figured it had to be some sort of multi-site OEE application. With that many gateways no wonder you've got so many tools to stay organized!

---

<div class="post-metadata">

**Author:** ![Ryan\_Deardorff](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ryan_deardorff/32/63815_2.png) [@Ryan\_Deardorff](https://forum.inductiveautomation.com/u/Ryan_Deardorff)\
**Post date:** [March 28, 2025, 9:33pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/56 "2025-03-28T21:33:33Z")

</div>

How does one enable the "refresh" button you show:

![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/2/e/2e2f5c0f1e4f662c4af640daa3645d74186489d6.png)

Nothing happens when I check any of the toolbar options, including the one I thought might have that: "Perspective Designer Toolbar." When I save a script file on the gateway, using the "Merge" button doesn't update my Designer on my local machine, but from your video it looks like maybe that refresh button does...?

I love that VS Code allows navigation via clicking a function name while holding down CTRL, something I really miss from my days of coding Java in IntelliJ. But it only seems to work within a single file/script. How can I get it to recognize all my other scripts so I can navigate between them that way?

If I can figure these two things out, I might never use the Designer for scripting again.

---

<div class="post-metadata">

**Author:** ![kgamble](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kgamble/32/8019_2.png) [@kgamble](https://forum.inductiveautomation.com/u/kgamble)\
**Post date:** [March 29, 2025, 1:42pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/57 "2025-03-29T13:42:44Z")

</div>

Did you install the [Project Scan Endpoint Module](https://github.com/design-group/ignition-project-scan-endpoint)? That is what adds that button in, as well as the REST endpoint at `data/project-scan-endpoint/scan` that the VS Code extension uses.

---

<div class="post-metadata">

**Author:** ![Ryan\_Deardorff](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ryan_deardorff/32/63815_2.png) [@Ryan\_Deardorff](https://forum.inductiveautomation.com/u/Ryan_Deardorff)\
**Post date:** [March 31, 2025, 1:55pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/58 "2025-03-31T13:55:07Z")

</div>

No, unfortunately I know nothing about Gradle or keystores, and am working in a Windows environment so the build instructions aren't very clear to me...

---

<div class="post-metadata">

**Author:** ![kgamble](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kgamble/32/8019_2.png) [@kgamble](https://forum.inductiveautomation.com/u/kgamble)\
**Post date:** [March 31, 2025, 2:19pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/59 "2025-03-31T14:19:57Z")

</div>

You can just download the module and install it on your gateway if you go to the [Releases page](https://github.com/design-group/ignition-project-scan-endpoint/releases) here

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/4/8/48685016ad55d350128eb61b13814eaa787ab576.png)

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/3/8/38e5c01fbdee8be397bcbd60fe10c9ea77855ba3.png)

Then install it on your gateway, and configure the VS Code extension settings as mentioned [here](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/53)

No need to do a custom build of it unless you are modifying it for your own purposes or making changes to the module directly.

Edit: I realized after pasting this I should probably just release it as v1.0.0... since it hasn't needed any updates since November and been working flawlessly... lol

---

<div class="post-metadata">

**Author:** ![Ryan\_Deardorff](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ryan_deardorff/32/63815_2.png) [@Ryan\_Deardorff](https://forum.inductiveautomation.com/u/Ryan_Deardorff)\
**Post date:** [March 31, 2025, 2:43pm UTC](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759/60 "2025-03-31T14:43:09Z")

</div>

> [@kgamble](#):
>
> ```python
> "ignitionFlint.ignitionGateways": [
> {
> "label": "Frontend",
> "address": "https://frontend.localtest.me", 
> "projectPaths": [ #The relative filesystem path to your ignition projects root directory.
> "temp/projects"
> ],
> "updateDesignerOnSave": true,
> "forceUpdateDesigner": true,
> "supportsProjectScanEndpoint": true
> }
> ]
> 
> ```

What are the `projectPaths` relative to? I just have them in the standard location on a Windows install: `C:\Program Files\Inductive Automation\Ignition\data\projects`

[Previous page](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759.md?page=2)

[Next page](https://forum.inductiveautomation.com/t/what-external-tools-do-you-use-for-ignition-development-and-why/93759.md?page=4)
