MS Configuration - PROCEED-Labs/proceed GitHub Wiki

The Management System (MS) can be configured in multiple ways:

  • Environment Variables and System Settings: are used to configure the Management System by infratsructure and system administrators
  • Personal and Organizational Space Settings: are used to configure Personal User and Organizational/Company Spaces

Environment Variables and System Settings

Environment Variables are given to the MS at startup.
System Settings are the same settings but in the UI of the admin dashboard. Most settings can be set by a system administrator at runtime, if these settings have not initially set by Environment Variables at MS startup.

The MS System Admin Dashboard shows (nearly) all possible settings, but they are not always configurable - sometimes they are just read-only: either it is a setting which can only be configured at startup with Environment Variables (see the following table) or the setting has been configured at startup by Environment Variables. (If a setting is set via an environment variable, the admin can not change this setting anymore in the UI.)

Set Environment Variables

Environment Variables can be set in multiple ways:

  • on the command line with the Node.js start
  • in docker with -e or in docker compose
  • with .env files

Important

Since the Environment Variables are read in at startup of the MS, this could cause conflicts if the same setting has been set in a previous run of the MS in the admin dashboard. Reason: the database is not deleted for a restart. If a setting has been previously set by a system admin in the UI and, after restart, is set by an Environment Variable, it will override the settings value and will make the setting read-only.

Read Env/System Variables in Backend

// in Backend, e.g. server components
import { env } from '@/lib/env-vars';
...
... env.YYY ...

Read Env/System Settings in the Frontend from PROCEED_PUBLIC_ Variables

There are situation where the frontend changes based on settings of the MS. For example, the execution views will not be shown if it is not activated. These settings available in the frontend begin with PROCEED_PUBLIC_. To read in the settings in the frontend, us the following code:

// in Frontend, e.g. client components
const Component = () => {
  const env = use(EnvVarsContext);

  ... env.PROCEED_PUBLIC_YYY ...
}

Configurable Values of Environment Variables and System Settings

*Only-Env: these configuration values are not changeable at runtime in the System Settings anymore, because they would require to restart the MS and probably delete all data in the DB as well. They can be only set at startup with environment variables.

Config Key Default Value Type and Values Explanation Only-Env*
PROCEED_PUBLIC_ GENERAL_MS_LOGO "" String, Filename inside the /public folder The default logo for all spaces shown in MS in the left corner
---
PROCEED_PUBLIC_ PROCESS_DOCUMENTATION_ ACTIVE "TRUE" Boolean: "TRUE" or "FALSE" Activates the functionalities for process modelling
PROCEED_PUBLIC_ GANTT_ ACTIVE "FALSE" Boolean: "TRUE" or "FALSE" Activates the functionalities for the Gantt Editor. (Maybe this variable will be removed later.)

Dependencies: PROCEED_PUBLIC_PROCESS_DOCUMENTATION_ACTIVE == true
PROCEED_PUBLIC_ PROCESS_AUTOMATION_ ACTIVE "FALSE" Boolean: "TRUE" or "FALSE" Activates the functionalities for process execution
PROCEED_PUBLIC_ PROCESS_AUTOMATION_ TASK_EDITOR_ ACTIVE "FALSE" Boolean: "TRUE" or "FALSE" Activates the functionalities for the separate form editor to allow creating single tasks.

Dependencies: PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE == true
PROCEED_PUBLIC_ COMPETENCE_MATCHING_ ACTIVE "TRUE" Boolean: "TRUE" or "FALSE" Activates the functionalities to assign competencies to users and to start the matching process within the process editor for UserTasks.

Dependencies: PROCEED_PUBLIC_PROCESS_DOCUMENTATION_ACTIVE == true and PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE == true
PROCEED_PUBLIC_ CONFIG_SERVER_ ACTIVE "FALSE" Boolean: "TRUE" or "FALSE" Activates the functionalities for the production machine configuration server
---
NODE_ENV "development" "development", "test", "production" Next.js environment variable. Should be set to "production" after building the MS.

https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables#good-to-know
X
---
NEXTAUTH_URL "" String/URL, e.g. "https://production.proceed-labs.org" Needed for OAuth authentification with NextAuth.js. When deploying to production, set the NEXTAUTH_URL environment variable to the canonical URL of your site. https://next-auth.js.org/configuration/options#nextauth_url
NEXTAUTH_URL_INTERNAL "" String/URL Optional. https://next-auth.js.org/configuration/options#nextauth_url_internal
NEXTAUTH_SECRET "" String Production: required

Auth.js uses this var to 1. encrypt a session JWT used in cookies and 2. to hash Sign In email verification tokens.
X
IAM_ORG_USER_ INVITATION_ENCRYPTION_ SECRET "" String Used to encrypt JWTs for links in invitation mails for users if an admin in an organizational space wants to add a user via mail.

Dependencies: PROCEED_PUBLIC_MAILSERVER_ACTIVE == true
X
SHARING_ENCRYPTION_SECRET "" String Format? make optional? X
IAM_GUEST_CONVERSION _REFERENCE_SECRET "" String Used to encrypt JWTs for links in Sign-In mails to convert a guest user to a normal user.

Dependencies: PROCEED_PUBLIC_IAM_LOGIN_MAIL_ACTIVE == true
X
---
DATABASE_URL "" String Production: required Connection string to the database that Prisma uses. E.g. postgresql://janedoe:mypassword@localhost:5433/proceed_db_research?schema=public X
Prisma Env Variables Optional, https://www.prisma.io/docs/orm/reference/environment-variables-reference X
---
PROCEED_PUBLIC_STORAGE_ DEPLOYMENT_ENV "local" "local", "cloud" Sets the storage system for files which are not stored in the DB. E.g. pictures. "local" stores the files on the local file system. see this wiki page. "cloud" stores the files on a Google bucket.

(is starts with PROCEED_PUBLIC_ because the frontend needs to decide where to store files. in the case of "cloud", it directly writes files into an bucket with a presigned link.)

Dependencies if == "cloud": STORAGE_CLOUD_ BUCKET_NAME, STORAGE_CLOUD_ BUCKET_CREDENTIALS
STORAGE_CLOUD_ BUCKET_NAME "" String Required, if "cloud". Name of the Google Bucket where the files should be stored in the case of "cloud"

Dependencies: PROCEED_PUBLIC_STORAGE_DEPLOYMENT_ENV == cloud
STORAGE_CLOUD_ BUCKET_CREDENTIALS_ FILE_PATH "" "" Optional. Path of a JSON credential file for accessing the Google Bucket. Optional, because there are multiple ways how the Google Client Libraries can authenticate. E.g. by attaching a Service Account to the Cloud Run instances in the cloud deployment.

Dependencies: PROCEED_PUBLIC_STORAGE_DEPLOYMENT_ENV == cloud
X
---
PROCEED_PUBLIC_ MAILSERVER_ACTIVE "FALSE" Boolean: "TRUE" or "FALSE" Activates the possibility for using a mail server in PROCEED (if the connection settings are correct).
MAILSERVER_URL "" String The URL of the SMTP server to send mails.

Dependencies: PROCEED_PUBLIC_MAILSERVER_ACTIVE == true
MAILSERVER_PORT "465" Number The PORT of the SMTP server to send mails. We use SMTP with encryption to connect to the mail server.

Dependencies: PROCEED_PUBLIC_MAILSERVER_ACTIVE == true
MAILSERVER_MS_DEFAULT_ MAIL_ADDRESS "" String The mail address for the general, administrative, user-independent mails of the MS. E.g. "[email protected]" for registration mails.

Dependencies: PROCEED_PUBLIC_MAILSERVER_ACTIVE == true
MAILSERVER_MS_DEFAULT_ MAIL_PASSWORD "" String The password for the general mail address of the MS.

Dependencies: PROCEED_PUBLIC_MAILSERVER_ACTIVE == true
---
PROCEED_PUBLIC_IAM_ACTIVE "FALSE" Boolean: "TRUE" or "FALSE" Activates the identity and access management, so that 1. users can register and login, 2. organizations with multiple users and roles/rights can be created. If deactivated (false), resources like processes are created under the default user "Admin".
This setting will consider no existing data about any Spaces in the database.
X
IAM_MS_ADMIN_INITIAL_PASSWORD "proceed" String MS admin password is always set in the seed file (default value, "proceed"), or optional inside this environment variable. This is useful for cloud deployment because another default password can be set. This password can be changed at runtime in the UI on the user page. Then, a restart of the MS does not reset the MS Admin password (even not if set via this env variables). X
PROCEED_PUBLIC_ IAM_LOGIN_MAIL_ACTIVE "FALSE" Boolean: "TRUE" or "FALSE" Activates that users can login and register via mail. (Mail server settings must be set.)

Dependencies: PROCEED_PUBLIC_IAM_ACTIVE == true, (PROCEED_PUBLIC_)MAILSERVER_* == true and contactable, NEXTAUTH_URL, NEXTAUTH_SECRET
PROCEED_PUBLIC_ IAM_LOGIN_USER_ PASSWORD_ACTIVE "TRUE" Boolean: "TRUE" or "FALSE Activates that users can login and register via username and password.

Dependencies: PROCEED_PUBLIC_IAM_ACTIVE == true
PROCEED_PUBLIC_ IAM_PERSONAL_SPACES_ACTIVE "TRUE" Boolean: "TRUE" or "FALSE true activates that users have their own personal space. (Besides being in multiple organizational spaces.)
False means that Users don't have an own Personal Space and can only be part of an Organizational Space. They can not register any new user account. Just Organizations can be created.

Dependencies: PROCEED_PUBLIC_IAM_ACTIVE == true
X
PROCEED_PUBLIC_ IAM_ONLY_ONE_ ORGANIZATIONAL_SPACE "FALSE" Boolean: "TRUE" or "FALSE" Only one Organizational Space is allowed in PROCEED MS. (Personal Spaces can also exist.) This is useful for local deployment in a company. The organization information is defined in a seed file. It is not possible to switch to another organizational Space, only to personal spaces if activated.

Dependencies: PROCEED_PUBLIC_IAM_ACTIVE == true
X
---
PROCEED_PUBLIC_ IAM_LOGIN_OAUTH_ GOOGLE_ACTIVE "FALSE" Boolean: "TRUE" or "FALSE Activates that users can login and register with Google OAuth.

Dependencies: PROCEED_PUBLIC_IAM_ACTIVE == true
X
IAM_LOGIN_OAUTH_ GOOGLE_CLIENT_ID "" String Google OAuth Client Id.

Dependencies: PROCEED_PUBLIC_IAM_LOGIN_OAUTH_GOOGLE_ACTIVE == true
X
IAM_LOGIN_OAUTH_ GOOGLE_CLIENT_SECRET "" String Google OAuth Client Secret.

Dependencies: PROCEED_PUBLIC_IAM_LOGIN_OAUTH_GOOGLE_ACTIVE == true
X
PROCEED_PUBLIC_ IAM_LOGIN_OAUTH_ X_ACTIVE "FALSE" Boolean: "TRUE" or "FALSE Activates that users can login and register with X OAuth.

Dependencies: PROCEED_PUBLIC_IAM_ACTIVE == true
X
IAM_LOGIN_OAUTH_ X_CLIENT_ID "" String X OAuth Client Id.

Dependencies: PROCEED_PUBLIC_IAM_LOGIN_OAUTH_X_ACTIVE == true
X
IAM_LOGIN_OAUTH_ X_CLIENT_SECRET "" String X OAuth Client Secret.

Dependencies: PROCEED_PUBLIC_IAM_LOGIN_OAUTH_X_ACTIVE == true
X
PROCEED_PUBLIC_ IAM_LOGIN_OAUTH_ DISCORD_ACTIVE "FALSE" Boolean: "TRUE" or "FALSE Activates that users can login and register with Discord OAuth.

Dependencies: PROCEED_PUBLIC_IAM_ACTIVE == true
X
IAM_LOGIN_OAUTH_ DISCORD_CLIENT_ID "" String Discord OAuth Client Id.

Dependencies: PROCEED_PUBLIC_IAM_LOGIN_OAUTH_DISCORD_ACTIVE == true
X
IAM_LOGIN_OAUTH_ DISCORD_CLIENT_SECRET "" String Discord OAuth Client Secret.

Dependencies: PROCEED_PUBLIC_IAM_LOGIN_OAUTH_DISCORD_ACTIVE == true
X
---
SCHEDULER_INTERNAL_ACTIVE true Boolean Whether to activate the internal scheduler. For the cloud, it should be deactivated since we use the scheduler of the cloud provider. The internal scheduler triggers the tasks via an internal call, the cloud scheduler via REST at the path HTTP POST /scheduler/tasks/all.
SCHEDULER_INTERNAL_INTERVAL "0 3 * * *" String with cron values Sets the time when the Scheduler should run. Default: every day at 3am. Hint: The scheduler only needs to run once to trigger a route at the MS. Inside the MS, there are multiple "Jobs" (Scheduling Tasks), which will run after the trigger.
SCHEDULER_SECURITY_TOKEN String A unique, secret token that the MS expects and that the cloud scheduler (not the internal scheduler) uses for triggering the tasks from outside via REST. It must be transmitted in the header field X-PROCEED-SCHEDULER-SECURITY-TOKEN:.
Main reason for the token: we don't want to allow everyone to trigger the scheduling tasks.
SCHEDULING_TASK_ DELETE_INACTIVE_GUESTS 30 Days as Integer This is a hard-coded "Scheduling Task" inside the MS which runs after triggered by the Scheduler: it checks if there are Guest accounts that have not been used for this specified time. If older, the task will delete these inactive guest accounts.
SCHEDULING_TASK_ DELETE_INACTIVE_SPACES 180 Days as Integer This is a hard-coded "Scheduling Task" inside the MS which runs after triggered by the Scheduler: it checks if there are Spaces (Organizations and Personal) that have not been used (logged-in) for this specified time. If older, the task will delete these inactive Spaces.
SCHEDULING_TASK_ DELETE_OLD_ARTIFACTS 7 Days as Integer This is a hard-coded "Scheduling Task" inside the MS which runs after triggered by the Scheduler: it checks if there are unused artifacts (ref counter == 0) accounts that have not been used for this specified time. If older, the task will delete these unused artifacts.
SCHEDULING_TASK_ EXPIRATION_TIME_ EMAIL_REGISTRATION_TOKENS 7 Hours as Integer This is a hard-coded "Scheduling Task" inside the MS which runs after triggered by the Scheduler: it checks if there are old verification tokens for e-mail registration that are older than this specified time. If older, the task will delete these token. This env variable is also used to set the expiration time for the token.
SCHEDULING_TASK_ EXPIRATION_TIME_ EMAIL_CHANGE_TOKENS 7 Hours as Integer This is a hard-coded "Scheduling Task" inside the MS which runs after triggered by the Scheduler: it checks if there are old verification tokens for e-mail change that are older than this specified time. If older, the task will delete these token. This env variable is also used to set the expiration time for the token.

System Admin Dashboard

All system settings are shown in the Admin Dashboard UI. Usually, an environment variable/system setting should be configurable in the UI by an admin. Its configured value will then be stored in the DB for being used after a restart.

There are exceptions that make a setting read-only in the UI: 1. if a setting was set at startup by an environment variable, 2. if it is a setting which makes no sense to change it at runtime, marked as Only-Env in the table.

There are also some few settings in the Admin Dashboard which can not be set as environment variables, because that would be too complex (usually lists): Additional Navigation Elements, Process Modeling Style Rules, Process Import Validation Rules, System MQTT Server, System Process Engines

And there are some environment variables, which are not shown in the UI: all MS secrets (except OAuth-Provider Secrets).

MS Admin System Dashboard
    Settings
        General
            MS Logo, PROCEED_PUBLIC_GENERAL_MS_LOGO
            Additional Navigation Elements (no Env Var): list in table format with columns `Name*, Icon*, URL*, Show Status`   (* means _required fields_ , "Icon" can be selected from a predefined list, "URL" can be HTTP(S) or MQTT, "Show Status" tests with HTTP GET or MQTT Connection setup if the system is online and shows a green or red dot next to the navigation element)

        Process Documentation, PROCEED_PUBLIC_PROCESS_DOCUMENTATION_ACTIVE: On/Off
            Process Modeling Style Rules (no Env Var): rule list with checkboxes (popup-modal)
            Process Import Validation Rules (no Env Var): rule list with checkboxes (popup-modal)
            Gantt Viewer and Editor, PROCEED_PUBLIC_GANTT_ACTIVE: On/Off

        Process Automation, PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE: On/Off
            System MQTT Servers (no Env Var): list in table format: Own Name, MQTT-Server Address, Username, Password, Base Topic
            System Process Engines (no Env Var): list in table format with Own Name, Engine Address

        Config Server, PROCEED_PUBLIC_CONFIG_SERVER_ACTIVE: On/Off

        NODE_ENV                                                (-> read-only because _Only-Env_)

        NEXTAUTH_URL

        DATABASE_URL                                            (-> read-only because _Only-Env_)

        PROCEED_PUBLIC_STORAGE_DEPLOYMENT_ENV                   (-> read-only because _Only-Env_)
            STORAGE_CLOUD_BUCKET_NAME                           (-> read-only because _Only-Env_)
            STORAGE_CLOUD_BUCKET_CREDENTIALS                    (-> read-only because _Only-Env_)

        Mail Server Active, PROCEED_PUBLIC_ MAILSERVER_ACTIVE, On/Off
            MAILSERVER_URL
            MAILSERVER_PORT
            MAILSERVER_MS_DEFAULT_MAIL_ADDRESS
            MAILSERVER_MS_DEFAULT_MAIL_PASSWORD

        PROCEED_PUBLIC_IAM_ACTIVE: On/Off                       (-> read-only because _Only-Env_)
            PROCEED_PUBLIC_IAM_LOGIN_MAIL_ACTIVE: On/Off        (-> read-only because _Only-Env_)
            PROCEED_PUBLIC_IAM_LOGIN_USER_PASSWORD_ACTIVE       (-> read-only because _Only-Env_)
            PROCEED_PUBLIC_IAM_PERSONAL_SPACES_ACTIVE           (-> read-only because _Only-Env_)
            PROCEED_PUBLIC_IAM_ONLY_ONE_ORGANIZATIONAL_SPACE    (-> read-only because _Only-Env_)

            PROCEED_PUBLIC_IAM_LOGIN_OAUTH_GOOGLE_ACTIVE
                IAM_LOGIN_OAUTH_GOOGLE_CLIENT_ID
                IAM_LOGIN_OAUTH_GOOGLE_CLIENT_SECRET
            PROCEED_PUBLIC_ IAM_LOGIN_OAUTH_ X_ACTIVE
                IAM_LOGIN_OAUTH_X_CLIENT_ID
                IAM_LOGIN_OAUTH_X_CLIENT_SECRET
            PROCEED_PUBLIC_IAM_LOGIN_OAUTH_DISCORD_ACTIVE
                IAM_LOGIN_OAUTH_DISCORD_CLIENT_ID
                IAM_LOGIN_OAUTH_DISCORD_CLIENT_SECRET

        "Scheduler"
            SCHEDULER_TOKEN
            SCHEDULER_INTERVAL
            SCHEDULER_JOB_DELETE_INACTIVE_GUESTS
            SCHEDULER_JOB_DELETE_OLD_ARTIFACTS

Settings in Personal and Organizational Spaces

Personal and Organizational Spaces are usually the same. They can have the same views and functionality enabled and disabled. The only difference is that a Personal Space is for one user and an Organizational Space is for multiple users. So, Organizational Space have additionally: Users, Roles and Permission Management

Actually, a Personal Space can be connected to a Home, for example to automate a smart home. Currently it is not possible to add multiple users to a home, but in the future we will maybe add this functionality. Then, there is nearly no difference between a Personal and an Organizational Space.

Every Space has a Settings View, where all Settings can be configured for the Space, and a Management View, where all business objects for the space are organized. For Personal Spaces, you can open this views under Home in the left navigation pane. For Organizational Spaces, as an Administrator, you can open this views under Organization in the left navigation pane

The Settings and Management View has multiple section for each view/functionality:

Organization / Home
    Settings
        General
            Logo
            Additional Navigation Elements: list in table format with columns Name*, Icon*, URL*, Show Status

        Process Documentation: On/Off   (-> section only visible if `PROCEED_PUBLIC_PROCESS_DOCUMENTATION_ACTIVE == true`)
            Process List: On/Off
            Projects: On/Off
            Process Editor: On/Off
            Process Templates: On/Off
            Process Modeling Style Rules: rule list with checkboxes (popup-modal)
            Process Import Validation Rules: rule list with checkboxes (popup-modal)
            Gantt Viewer and Editor: On/Off    (-> section only visible if `PROCEED_PUBLIC_GANTT_ACTIVE == true`)
                - here will be multiple config options about the BPMN to Gantt transformation

        Process Automation: On/Off   (-> section only visible if `PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE == true`)
            Dashboard: On/Off
            Executions: On/Off
            Machines: On/Off
                Default Deployment to: "Own Process Engines" or "System Process Engines"
                Allow Deployment to System Process Engines: On/Off
                Add Own MQTT Servers: list in table format with Own Name, Server Address, Username, Password, Base Topic    (-> these settings are synced with the Machines page)
                Add Own Process Engines: list in table format with Own Name, Engine Address                                 (->this setting is synced with the Machines page)

        Config Server: On/Off   (-> section only visible if `PROCEED_PUBLIC_CONFIG_SERVER_ACTIVE == true`)
            Name of Config Server: String
            MQTT-Server: Own Name, Server Address, Username, Password, Base Topic
            MQTT Topics

    Management
        Organization/Home Info: Name, Description, Contact Phone Number, Contact E-Mail, Owners (one user in Personal Spaces, multiple users allowed in Org Spaces -> will be admins)

        Organization/Home Structure: multiple entries/units in table with Short Name*, Long Name, Description, Part of (reference another parent unit so that a hierachical structure is built up), Categories (multiple entries possible like Tags. predefined: Unit, Building, Room, Factory), Bookable, Location, Linked Assets

        Assets and Items (Explanation in heading that it can be everything: Item in Inventory, Equipment, Tools, Consumable Material, Inspection Instruments): Short Name*, Long Name, Description, Categories (multiple entries possible like Tags. predefined: Inventory Item, Equipment, Tools, Consumable Material), Bookable, Manufacturer, Serial Number, Tags, Stored Quantity, Reserved Quantity, Available Quantity

        Units

        Competencies

        Categories: Tabbed Table for different Part of the MS, e.g. Org Structure Categories, Asset Categories, Config Server Categories, etc.

        Milestones

As you can see, most settings are separated in sections which are related to the respective environment variables. But they are more fine granular and have multiple sub-sections, usually about every navigational element on the left navigational side. These setting sections and sub-section are not shown, if the respective environment variable is not activated, e.g. if PROCEED_PUBLIC_PROCESS_DOCUMENTATION is false then the settings sections about documentation and its subsection are not visible.

One main option in each section is to disable the respective view/functionality for the whole Space. For example, in the settings menu it can be turned off that users of a space can see the Automation view or even more specifically the Machines view. By default, all views are activated. Their access rights are usually better controlled by roles, which can be configured more finely.

User-specific Device Settings

Some view-related settings can be very device-specific. For example, users often don't want to have the same wide table view on a wide screen and a small smartphone. For this reason, some settings are stored in the localstorage of the browser:

Original:

{
    "documentation.editor.list.iconView":false, // currently: "icon-view-in-process-list"
    "organization.users.list.iconView":false, // currently: "icon-view-in-user-list"
    "organization.roles.list.iconView":false, // currently:  "icon-view-in-role-list"
    "documentation.editor.list.table.columns":[ // currently: "columns-in-table-view-process-list"
        {"name":"Favorites","width":40},
        {"name":"Name","width":"auto"},
        {"name":"Description","width":"auto"},
        {"name":"Last Edited","width":"auto"}],
    "organization.roles.list.metaPanel":{"open":false,"width":300}, // currently: "role-page-side-panel"
    "organization.users.list.metaPanel":{"open":false,"width":300}, // currently: "user-page-side-panel"
    "documentation.editor.list.metaPanel":{"open":false,"width":300}, // currently: "process-meta-data"
    "configServer.configSet.treeView":[ // currently: "tech-data-open-tree-items"
        {   "id":"b24a8db4-5497-4743-bfb3-61ad984f048e",
            "open":["b24a8db4-5497-4743-bfb3-61ad984f048e|config","bb73f6be-c2c0-435f-9fc8-16ae58f195a3|machine-config","5825ff3c-abe9-49ea-a389-39e979bb51a5|target-config"]
        }],
    "configServer.list.metaPanel":{"siderOpen":true,"siderWidth":300} // currently: "tech-data-editor"
}
⚠️ **GitHub.com Fallback** ⚠️