# Musson Industrial's Embr-Periscope Module

**URL:** <https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047>\
**Category:** 3rd Party Modules\
**Tags:** perspective\
**Created:** [November 24, 2024, 10:26pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047 "2024-11-24T22:26:31Z")\
**Posts on this page:** 20\
**Page:** 5

<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:** [March 20, 2026, 3:50am UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/83 "2026-03-20T03:50:09Z")

</div>

# Release Notice

[Embr v8.1 - 2026.3.20](https://github.com/mussonindustrial/embr/releases/tag/releases%2F8.1%2F2026.3.20)  
[Embr v8.3 - 2026.3.20](https://github.com/mussonindustrial/embr/releases/tag/releases%2F8.3%2F2026.3.20)

This release fixes some bugs related to `periscope.toast` on iOS, Safari, and mobile devices.  
Shoutout to @aaronrai24 for helping test.

This release also adds `perspective.context.view` and `perspective.context.component` object references to the `runJavaScript` context. This allows you to reference the current calling component/view. Note, these are not available when targeting a remote session or page.

## Full Change Log

## @embr-modules/periscope-web@0.12.0

### Minor Changes

- [dd8a25b](https://github.com/mussonindustrial/embr/commit/dd8a25b16c0a87808aede0f5f429a93f7b5a4d42): `runJavaScript` functions now expose `perspective.context.component`. This is the client-side `ComponentModel` of the component that made the `runJavaScript` function call.
  - This is `undefined` when targeting a specific `session`/`page`.

- [dd8a25b](https://github.com/mussonindustrial/embr/commit/dd8a25b16c0a87808aede0f5f429a93f7b5a4d42): `runJavaScript` functions now expose `perspective.context.view`, the client-side `ViewModel` of the view that made the `runJavaScript` call.
  - This is `undefined` when targeting a specific `session`/`page`.

### Patch Changes

- [2aa9142](https://github.com/mussonindustrial/embr/commit/2aa9142b474f9a222716479aad2f777a06c81774): Toast container now smoothly transitions when docks are open/closed.
- [06455f1](https://github.com/mussonindustrial/embr/commit/06455f1e09013056cfe107894e81e680f0addad0): Remove dock padding when screen size suggests a mobile device. This allows the toast to span the full device width when docks are present on mobile.
- [afa89e6](https://github.com/mussonindustrial/embr/commit/afa89e67eb8f3d63dc6005b713fa1edd591ad18d): Move z-index to the toast root container. Resolves [#435](https://github.com/mussonindustrial/embr/issues/435).
- [cb55367](https://github.com/mussonindustrial/embr/commit/cb55367fa2769e4012e387c4229a90ba93c39e6a): Refactor to properly distribute functions between `perspective-client` and `utils`. `utils` should be usable by any React project, and `perspective-client` should contain all helpers that are specific to Perspective.
- Updated dependencies [[dd8a25b](https://github.com/mussonindustrial/embr/commit/dd8a25b16c0a87808aede0f5f429a93f7b5a4d42)]
- Updated dependencies [[ca09383](https://github.com/mussonindustrial/embr/commit/ca09383b6026db691c4af37a6dd05adea3807c1b)]
- Updated dependencies [[cb55367](https://github.com/mussonindustrial/embr/commit/cb55367fa2769e4012e387c4229a90ba93c39e6a)]
  - @embr-js/perspective-client@0.6.2
  - @embr-js/utils@0.6.2

---

<div class="post-metadata">

**Author:** ![mdia](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/mdia/32/87599_2.png) [@mdia](https://forum.inductiveautomation.com/u/mdia)\
**Post date:** [April 20, 2026, 5:18am UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/84 "2026-04-20T05:18:47Z")

</div>

This [Ignition Exchange Resource](https://inductiveautomation.com/exchange/2872/overview) should be close to what you're looking for.

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [May 12, 2026, 1:36pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/85 "2026-05-12T13:36:46Z")

</div>

Hey @bmusson, the latest couple of releases seem to be missing the built modl files, not sure if this was intentional or something went awry? Do you have the modls available (i'm looking for periscope and charts at this stage). Cheers!

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

---

<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:** [May 12, 2026, 1:54pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/86 "2026-05-12T13:54:46Z")

</div>

Thanks for the heads up, I’ll rerun the affected releases.

I changed releases to be Immutable, but didn’t take into account how I’m building the release 😂

I’m creating the release, then uploading the artifacts after (which is failing because it’s immutable lol).

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [May 12, 2026, 1:57pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/87 "2026-05-12T13:57:50Z")

</div>

Haha, that ol' chestnut!

---

<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:** [May 12, 2026, 2:12pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/88 "2026-05-12T14:12:47Z")

</div>

The affected releases have been re-run.

The version numbers were double bumped... but I don't think I care.

---

<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:** [May 28, 2026, 3:43pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/89 "2026-05-28T15:43:43Z")

</div>

# Release Notice

[Embr v8.1 - 2026.5.28](https://github.com/mussonindustrial/embr/releases/tag/releases%2F8.1%2F2026.5.28)  
[Embr v8.3 - 2026.5.28](https://github.com/mussonindustrial/embr/releases/tag/releases%2F8.3%2F2026.5.28)

# Client Resources + React Component

Client Resources are files compiled to JavaScript that are loaded by the Perspective client on launch.

There are currently two supported types:

1. **TypeScript** (supports JavaScript, TypeScript, JSX, and TSX)
2. **CSS Modules**

All Client Resources loaded and run on page load/refresh, serving as a direct, robust alternative to Markdown Injection. They can also provide React components, which can be used via a new dedicated React Perspective component or anywhere you would normally use an `EmbeddedView`.

Attached is an example project that demonstrates:

- Writing React components.
- Accessing the available `system` modules: (`system:perspective` and `system:periscope`)
- Importing/exporting between Client Resources.
- Using style classes from CSS Modules.
- Rendering Client Resources inside of `EmbeddedViews`, using `@/{path}` syntax.

[client-resource-testing\_2026-05-28\_1506.zip](https://forum.inductiveautomation.com/uploads/short-url/nHVLQmiG7L2KWXAUjug4SYTOlez.zip) (400.9 KB)

 ![20260528113411](https://us1.discourse-cdn.com/inductiveautomation/original/3X/3/e/3eff9bed854ea90c41d75f584ce2068d1b905349.png)  
 ![20260528113901](https://us1.discourse-cdn.com/inductiveautomation/original/3X/e/5/e59ad26ddadabb11fce83fc3391991b2cd324fc4.png)

## Future Work

- Synchonous Loading

- Embr Charts Integration

---

<div class="post-metadata">

**Author:** ![nader.chinichian](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nader.chinichian/32/9261_2.png) [@nader.chinichian](https://forum.inductiveautomation.com/u/nader.chinichian)\
**Post date:** [June 1, 2026, 6:21pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/90 "2026-06-01T18:21:02Z")

</div>

For external dependencies or complex libraries, is it possible to load files directly from a folder on the hard drive instead of defining them one by one inside the Designer’s Resources section? For example, could we configure a specific directory that the module can access and import files from at runtime, similar to how a web development module exposes a shared folder?

---

<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:** [June 1, 2026, 7:37pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/91 "2026-06-01T19:37:24Z")

</div>

> [@nader.chinichian](#):
>
> similar to how a web development module exposes a shared folder

You can actually use

```js
import * from “@webdev/{path}”

```

to reference the current project’s WebDev root:

> <https://github.com/mussonindustrial/embr/blob/8.1/main/modules/periscope/gateway/src/main/kotlin/com/mussonindustrial/ignition/embr/periscope/js/ClientResourceImportRewriter.kt#L5C1-L18C2>

If you put your resources in a folder and then mount it using the WebDev module, you should be able to load them this way.

I’d like to have a more dedicated way to load 3rd party libraries though, so I’m open to any suggestions.

---

<div class="post-metadata">

**Author:** ![nader.chinichian](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nader.chinichian/32/9261_2.png) [@nader.chinichian](https://forum.inductiveautomation.com/u/nader.chinichian)\
**Post date:** [June 1, 2026, 8:11pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/92 "2026-06-01T20:11:42Z")

</div>

> [@bmusson](#):
>
> them

Your module should expose a dedicated folder inside ignition data folder to user so user doesn't need to buy webdev only for this purpose.

---

<div class="post-metadata">

**Author:** ![nader.chinichian](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nader.chinichian/32/9261_2.png) [@nader.chinichian](https://forum.inductiveautomation.com/u/nader.chinichian)\
**Post date:** [June 1, 2026, 8:13pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/93 "2026-06-01T20:13:57Z")

</div>

I get this error when I install the module on 8.1.52:

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

---

<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:** [June 1, 2026, 9:14pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/94 "2026-06-01T21:14:42Z")

</div>

Ah dang, that error is going to appear on any 8.1.49+ gateway.

That change is over a year old, so it’s definitely time for us to commit to Embr’s 8.1 branch to 8.1.49+ compatibility.

(Also shows that it’s time for my customers to upgrade too 👀)

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [June 3, 2026, 5:15am UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/95 "2026-06-03T05:15:57Z")

</div>

Hey @bmusson, I questioned a few weeks ago whether your Periscope module's EmbeddedView+ container might resolve the issue with IA's EmbeddedView container randomly not passing params through sometimes (or not-so sometimes!!) when you have nested views (even 2 layers deep), often where the params have dicts/objects and lists.

I've just done an upgrade from v8.1.42 to 8.1.51 and noticed that a lot of the EmbeddedView containers had these issues, so I moved some of the problem ones across to EmbeddedView+ and the issue went away entirely; I cannot get them to fail.

So I think the answer to my question is "yes", it does resolve the issue.  
Although now my question to IA is: why _is it_ still an issue??

---

<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:** [June 3, 2026, 4:46pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/96 "2026-06-03T16:46:08Z")

</div>

> [@nminchin](#):
>
> why _is it_ still an issue??

If I had to guess:

1. It’s been this way forever.
2. They can’t really solve it without re-architecting how views are initialized.
3. They can only do that during a major release.
4. 8.3 has enough going on already.

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [June 3, 2026, 11:31pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/97 "2026-06-03T23:31:08Z")

</div>

Some would say that the symbols on the screen reflecting the bindings that you've set on them is somewhat important for a SCADA system though 🤭

---

<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:** [June 3, 2026, 11:37pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/98 "2026-06-03T23:37:39Z")

</div>

I agree, to the point that I went and found a solution 😂

---

<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:** [June 4, 2026, 3:24am UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/99 "2026-06-04T03:24:04Z")

</div>

# Release Notice

[Embr v8.1 - 2026.6.4](https://github.com/mussonindustrial/embr/releases/tag/releases%2F8.1%2F2026.6.4)  
[Embr v8.3 - 2026.6.4](https://github.com/mussonindustrial/embr/releases/tag/releases%2F8.3%2F2026.6.4)

This release resolves a NPE error reported by @jpark.  
Thanks Jae!

> ## @embr-modules/periscope@0.14.1
> 
> ### Patch Changes
> 
> - [0e6b25f](https://github.com/mussonindustrial/embr/commit/0e6b25f5e082c0d5dce224f211fc3a06512c4c0d): Resolve NPE related to `ClientResourceManager` initialization for `ClientResourceWorkspace`'s Welcome Page.
> - @embr-modules/periscope-web@0.14.1

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [June 4, 2026, 2:58pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/100 "2026-06-04T14:58:30Z")

</div>

![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/d/0/d00ab4ac5826e01b011badbcd5c4941d4ba801e3.png)

I started this java GUI for the designer to facilitate easy switching between EmbeddedView and EmbeddedView+ because of this 🤭  
(It just migrates the differently named props between the two since they're different [better, more consistent names in yours, imo])

---

<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:** [June 5, 2026, 1:14pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/102 "2026-06-05T13:14:01Z")

</div>

Yeah, I need to target 8.1.49+ for this to work.

I’m torn between totally dropping support for 8.1.33 through 8.1.49, or maintaining a separate release branch.

Any thoughts from the community? What are other 3rd party module authors doing?

---

<div class="post-metadata">

**Author:** ![liam1](https://avatars.discourse-cdn.com/v4/letter/l/e68b1a/32.png) [@liam1](https://forum.inductiveautomation.com/u/liam1)\
**Post date:** [June 5, 2026, 1:26pm UTC](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047/103 "2026-06-05T13:26:11Z")

</div>

I think that's fine to support it for versions 8.1.49+ , I personally wouldn't mind upgrading a client's gateway to the latest version of 8.1 to use it.

[Previous page](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047.md?page=4)

[Next page](https://forum.inductiveautomation.com/t/musson-industrials-embr-periscope-module/99047.md?page=6)
