**Describe the bug**
Whenever you create a new OpenRemote instance the default (…generated) `manager_config.json` value is invalid causing an error whenever saving the "Appearance" settings.
**To Reproduce**
Steps to reproduce the behavior:
1. Create a new OpenRemote instance
2. Go to 'Appearance'
3. Change the Primary realm color to blue
4. Click on Save'
**Expected behavior**
The primary realm color changes after clicking the Save button.
**Screenshots**

**Additional context**
The following logging shows in the backend:
```
2025-02-17 14:31:27.908 FINE [WebService I/O-13 ] enremote.container.web.RequestLogger.API : Client request '/api/master/configuration/manager (responseType=application/json, text/plain, */*)': user=null, origin=/172.19.0.1:52720, forwarded-for=null
2025-02-17 14:31:27.909 ERROR [WebService task-6 ] jboss.resteasy.plugins.providers.jackson : RESTEASY-JACKSON000100: Not able to deserialize data provided
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.LinkedHashMap<java.lang.String,java.lang.Object>` from Array value (token `JsonToken.START_ARRAY`)
at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 10] (through reference chain: org.openremote.model.manager.ManagerAppConfig["pages"])
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1767)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1541)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromArray(StdDeserializer.java:222)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:457)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:32)
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:138)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:310)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342)
at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:2099)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1249)
at org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider.readFrom(ResteasyJackson2Provider.java:184)
at org.jboss.resteasy.core.interception.jaxrs.AbstractReaderInterceptorContext.readFrom(AbstractReaderInterceptorContext.java:99)
at org.jboss.resteasy.core.interception.jaxrs.ServerReaderInterceptorContext.readFrom(ServerReaderInterceptorContext.java:60)
at org.jboss.resteasy.core.interception.jaxrs.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:81)
at org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:192)
at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:87)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:116)
at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:560)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:452)
at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:413)
at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:415)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:378)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:356)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:70)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:429)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:240)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:154)
at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:157)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:229)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:222)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
at org.openremote.container.security.CORSFilter.doFilter(CORSFilter.java:135)
at org.openremote.container.web.file.HttpFilter.doFilter(HttpFilter.java:108)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.keycloak.adapters.undertow.UndertowAuthenticatedActionsHandler.handleRequest(UndertowAuthenticatedActionsHandler.java:66)
at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.openremote.container.security.IdentityService$1$1.handleRequest(IdentityService.java:92)
at org.keycloak.adapters.undertow.ServletPreAuthActionsHandler.handleRequest(ServletPreAuthActionsHandler.java:72)
at io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:101)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)
at java.base/java.lang.Thread.run(Thread.java:1583)
```
These are the JSON settings that show when editing the JSON string:
```json
{
"pages": [
{
"name": "map",
"routes": [
"map",
"map/:id"
]
},
{
"name": "assets",
"routes": [
"assets",
"assets/:editMode",
"assets/:editMode/:ids"
]
},
{
"name": "gateway",
"routes": [
"gateway"
]
},
{
"name": "gateway-tunnel",
"routes": [
"gateway-tunnel"
]
},
{
"name": "logs",
"routes": [
"logs"
]
},
{
"name": "insights",
"routes": [
"insights",
"insights/:editMode",
"insights/:editMode/:id"
]
},
{
"name": "rules",
"routes": [
"rules",
"rules/:id"
]
},
{
"name": "account",
"routes": [
"/account"
]
},
{
"name": "roles",
"routes": [
"roles"
]
},
{
"name": "users",
"routes": [
"users",
"users/:id",
"users/new/:type"
]
},
{
"name": "realms",
"routes": [
"realms"
]
},
{
"name": "export",
"routes": [
"data-export"
]
},
{
"name": "provisioning",
"routes": [
"provisioning"
]
},
{
"name": "configuration",
"routes": [
"configuration"
]
},
{
"name": "alarms",
"routes": [
"alarms",
"alarms/:id"
]
}
],
"superUserHeader": {
"mainMenu": [
{
"icon": "map",
"href": "map",
"text": "map"
},
{
"icon": "rhombus-split",
"href": "assets",
"text": "asset_plural"
},
{
"icon": "state-machine",
"href": "rules",
"text": "rule_plural",
"hideMobile": true
},
{
"icon": "chart-areaspline",
"href": "insights",
"text": "insights"
}
],
"secondaryMenu": [
{
"icon": "cloud",
"value": "gateway",
"href": "gateway",
"text": "gatewayConnection",
"roles": [
"write:admin",
"read:admin"
]
},
{
"icon": "lan-connect",
"value": "gateway-tunnel",
"href": "gateway-tunnel",
"text": "gatewayTunnels.",
"roles": [
"write:admin",
"read:admin"
]
},
{
"icon": "web",
"value": "language",
"text": "language"
},
{
"icon": "text-box-search-outline",
"value": "logs",
"href": "logs",
"text": "logs",
"hideMobile": true,
"roles": [
"write:logs",
"read:logs"
]
},
{
"icon": "account",
"value": "account",
"href": "account",
"text": "account",
"roles": {
"account": [
"manage-account"
]
}
},
{
"icon": "account-group",
"value": "users",
"href": "users",
"text": "user_plural",
"roles": [
"read:admin",
"write:admin"
]
},
{
"icon": "account-box-multiple",
"value": "roles",
"href": "roles",
"text": "role_plural",
"roles": [
"read:admin",
"write:admin"
]
},
{
"icon": "domain",
"value": "realms",
"href": "realms",
"text": "realm_plural"
},
{
"icon": "database-export",
"value": "export",
"href": "data-export",
"text": "dataExport"
},
{
"icon": "cellphone-cog",
"value": "provisioning",
"href": "provisioning",
"text": "autoProvisioning"
},
{
"icon": "palette-outline",
"value": "configuration",
"href": "configuration",
"text": "appearance"
},
{
"icon": "logout",
"value": "logout",
"text": "logout"
}
]
},
"realms": {
"default": {
"appTitle": "OpenRemote Manager",
"header": {
"mainMenu": [
{
"icon": "map",
"href": "map",
"text": "map"
},
{
"icon": "rhombus-split",
"href": "assets",
"text": "asset_plural"
},
{
"icon": "state-machine",
"href": "rules",
"text": "rule_plural",
"hideMobile": true
},
{
"icon": "chart-areaspline",
"href": "insights",
"text": "insights"
}
],
"secondaryMenu": [
{
"icon": "cloud",
"value": "gateway",
"href": "gateway",
"text": "gatewayConnection",
"roles": [
"write:admin",
"read:admin"
]
},
{
"icon": "lan-connect",
"value": "gateway-tunnel",
"href": "gateway-tunnel",
"text": "gatewayTunnels.",
"roles": [
"write:admin",
"read:admin"
]
},
{
"icon": "web",
"value": "language",
"text": "language"
},
{
"icon": "text-box-search-outline",
"value": "logs",
"href": "logs",
"text": "logs",
"hideMobile": true,
"roles": [
"write:logs",
"read:logs"
]
},
{
"icon": "account",
"value": "account",
"href": "account",
"text": "account",
"roles": {
"account": [
"manage-account"
]
}
},
{
"icon": "account-group",
"value": "users",
"href": "users",
"text": "user_plural",
"roles": [
"read:admin",
"write:admin"
]
},
{
"icon": "account-box-multiple",
"value": "roles",
"href": "roles",
"text": "role_plural",
"roles": [
"read:admin",
"write:admin"
]
},
{
"icon": "domain",
"value": "realms",
"href": "realms",
"text": "realm_plural"
},
{
"icon": "database-export",
"value": "export",
"href": "data-export",
"text": "dataExport"
},
{
"icon": "cellphone-cog",
"value": "provisioning",
"href": "provisioning",
"text": "autoProvisioning"
},
{
"icon": "palette-outline",
"value": "configuration",
"href": "configuration",
"text": "appearance"
},
{
"icon": "logout",
"value": "logout",
"text": "logout"
}
]
}
}
},
"manager": {}
}
```
It is possible to save the settings if you remove the "pages" key from the JSON.
See also: https://forum.openremote.io/t/appearance-tab-changes-not-saving-page-reloads-json-deserialization-error/3662?u=wborn