# Custom system.project properties, or something like it

**URL:** <https://forum.inductiveautomation.com/t/custom-system-project-properties-or-something-like-it/112544>\
**Category:** Ignition\
**Tags:** ignition81, vision\
**Created:** [December 1, 2025, 8:39pm UTC](https://forum.inductiveautomation.com/t/custom-system-project-properties-or-something-like-it/112544 "2025-12-01T20:39:07Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![sherman](https://avatars.discourse-cdn.com/v4/letter/s/e5b9ba/32.png) [@sherman](https://forum.inductiveautomation.com/u/sherman)\
**Post date:** [December 1, 2025, 8:39pm UTC](https://forum.inductiveautomation.com/t/custom-system-project-properties-or-something-like-it/112544/1 "2025-12-01T20:39:08Z")

</div>

I’d like to do something where every project knows its own name, but with transformations in place. I have found system.project.getProjectName() but a) it is a function not a property and b) it is not exactly what I need because I need a subset of the project name.

Is there a way to add a custom Vision project property, or something like it? I can’t use startup client events because they dont run in the designer, which means everything would always be broken in the designer. Nothing in the project properties menu for 8.1.41 looks like it solves what I need.

I just need a place to put a custom string that this project permanently knows so that I can reference it in implicit tag pathing. All the solutions I have so far involve tags which means that it is not project-scoped. I’ve considered something like a custom property in the navigation bar but I don’t think that is the right way to do it.

---

<div class="post-metadata">

**Author:** ![MMaynard](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/mmaynard/32/3366_2.png) [@MMaynard](https://forum.inductiveautomation.com/u/MMaynard)\
**Post date:** [December 1, 2025, 8:40pm UTC](https://forum.inductiveautomation.com/t/custom-system-project-properties-or-something-like-it/112544/2 "2025-12-01T20:40:12Z")

</div>

Use a client tag?

That is how we do custom properties in vision.

---

<div class="post-metadata">

**Author:** ![sherman](https://avatars.discourse-cdn.com/v4/letter/s/e5b9ba/32.png) [@sherman](https://forum.inductiveautomation.com/u/sherman)\
**Post date:** [December 1, 2025, 8:41pm UTC](https://forum.inductiveautomation.com/t/custom-system-project-properties-or-something-like-it/112544/3 "2025-12-01T20:41:49Z")

</div>

That’s it! Thank you – I totally forgot these existed. 95% sure this is what I need.

---

<div class="post-metadata">

**Author:** ![sherman](https://avatars.discourse-cdn.com/v4/letter/s/e5b9ba/32.png) [@sherman](https://forum.inductiveautomation.com/u/sherman)\
**Post date:** [December 1, 2025, 8:47pm UTC](https://forum.inductiveautomation.com/t/custom-system-project-properties-or-something-like-it/112544/4 "2025-12-01T20:47:29Z")

</div>

One problem with this (which makes sense) is that I can not get Gateway tags to reference it. Do you ever engage with that kind of issue? I am thinking I can put a startup script that forces a synchronization, but I don’t love the solution.

---

<div class="post-metadata">

**Author:** ![MMaynard](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/mmaynard/32/3366_2.png) [@MMaynard](https://forum.inductiveautomation.com/u/MMaynard)\
**Post date:** [December 1, 2025, 9:12pm UTC](https://forum.inductiveautomation.com/t/custom-system-project-properties-or-something-like-it/112544/5 "2025-12-01T21:12:12Z")

</div>

A script library with declared global dictionaries for each project at the top of it?

Or dataset tags in a root folder of the default tag provider.

Those are the paths I would take if I needed to reference it from the gateway scope.

You could then even have the client tags as expression tags and pull the variables from the script project or the default tag provider based off of project name.

---

<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:** [December 1, 2025, 9:36pm UTC](https://forum.inductiveautomation.com/t/custom-system-project-properties-or-something-like-it/112544/6 "2025-12-01T21:36:39Z")

</div>

> [@sherman](#):
>
> can not get Gateway tags to reference it

Gateway tags do not **ever** live in a project, and cannot access anything other than the gateway scripting project. So how would you expect something like that to work, anyways?

Use Vision Client Tags in Vision, and Session Properties in Perspective. Full stop.

---

<div class="post-metadata">

**Author:** ![sherman](https://avatars.discourse-cdn.com/v4/letter/s/e5b9ba/32.png) [@sherman](https://forum.inductiveautomation.com/u/sherman)\
**Post date:** [December 1, 2025, 9:52pm UTC](https://forum.inductiveautomation.com/t/custom-system-project-properties-or-something-like-it/112544/7 "2025-12-01T21:52:06Z")

</div>

I don’t expect it to work, thats why I am looking for alternative solutions. The problem that I have is that my tags are all gateway scoped but need implicit steering that is a function of the project name, which is of course project scoped. I need the project and the gateway to get along in this regard, so I am looking for the best way to get them to do that. As much work is done as possible in the gateway instead of the client, but they still need to talk to each other.

I need the client indirect tags to be aware of their own project name (e.g. project\_id = system.project.getProjectName().split(“\_”)[0].lower(), or something) so that they can set the _path_ for the gateway tags that they need access to. [PROVIDER]{project\_id}/… is the pattern that I use. I need a place to put {project\_id} that the _project_ is aware of, so that it can reference the _gateway_ tag paths.

My current solution (which is not a true solution) is to have a tag inside [PROVIDER]{project\_id}/active\_project with the value of {project\_id}. You might be able to see the problem with this solution, and it is what I am trying to resolve.

---

<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:** [December 1, 2025, 9:57pm UTC](https://forum.inductiveautomation.com/t/custom-system-project-properties-or-something-like-it/112544/8 "2025-12-01T21:57:46Z")

</div>

> [@sherman](#):
>
> The problem that I have is that my tags are all gateway scoped but need implicit steering that is a function of the project name, which is of course project scoped.

You cannot from the gateway side.

> [@sherman](#):
>
> I need the client indirect tags to be aware of their own project name

Make a Vision client tag and set its expression to `runScript("system.util.getProjectName", 0)`

Use that client tag as one of your substitutions in all of your indirect tag bindings. (Wrap with lowercase or other manipulations as needed.)

{ We've had **exactly** this same discussion before. }

---

<div class="post-metadata">

**Author:** ![sherman](https://avatars.discourse-cdn.com/v4/letter/s/e5b9ba/32.png) [@sherman](https://forum.inductiveautomation.com/u/sherman)\
**Post date:** [December 1, 2025, 10:00pm UTC](https://forum.inductiveautomation.com/t/custom-system-project-properties-or-something-like-it/112544/9 "2025-12-01T22:00:25Z")

</div>

Thats pretty much what I did since being reminded that Vision Client tags are a thing!

{My brain is mush, so thank you for having it again}
