AppSettings.config
The ~/Configuration/AppSettings.config file allows you to configure the location of asset folders, the state file storage, and the security model.
The following snippet shows application parameters of Customer's Canvas, which you can set up in either the appSettings section of Web.config or the separate ~/Configuration/AppSettings.config, and their values. You can click a key to navigate to its description.
<appSettings>
<!-- Paths -->
<add key="DesignFolder" value="..\assets\designs" />
<add key="MockupFolder" value="..\assets\mockups" />
<add key="WatermarkFolder" value="..\assets\helpers" />
<add key="DesignImagesFolder" value="..\assets\helpers" />
<add key="PublicGalleryFolder" value="..\assets\images" />
<add key="UserDataFolder" value="..\userdata" />
<!-- Storage -->
<add key="StorageRootPath" value="" />
<add key="PreloadFilesInMemory" value="true" />
<add key="UseResourcesProtectorForMultipleInstanses" value="false" />
<!-- Asset Storage -->
<add key="AssetStorageEndpoint" value="" />
<add key="AssetStorageApiKey" value="" />
<add key="AssetStorageTenantId" value="" />
<add key="AssetStorageRetryCount" value="3" />
<add key="AssetProcessorEndpoint" value="" />
<add key="AssetProcessorApiKey" value="" />
<add key="AssetStorageStates" value="False" />
<add key="AssetStoragePublicGallery" value="False" />
<add key="AssetStorageFonts" value="False" />
<add key="AssetStorageFontsPath" value="" />
<add key="AssetStorageFontsCheckInterval" value="60" />
<add key="AssetStorageTemplates" value="False" />
<add key="AssetStorageImages" value="False" />
<add key="MessageBus:RabbitMQ" value="" />
<add key="MessageBus:AzureServiceBus" value="" />
<!-- State file management -->
<add key="MasterUserId" value="masteruser" />
<add key="DefaultUserId" value="default" />
<add key="StateFileStorageEnabled" value="False" />
<add key="AnonymousModeEnabled" value="False" />
<add key="DemoModeEnabled" value="False" />
<add key="HiResControllerStoreDataInState" value="True" />
<!-- Font management -->
<add key="FontSubstitutionEnabled" value="False" />
<add key="SubstitutionFontPostScriptName" value="Roboto-Regular" />
<add key="DefaultFontPostScriptName" value="Roboto-Regular" />
<add key="LoadFontListAsPostScriptNames" value="True" />
<add key="Hinting" value="Auto" />
<!-- Editor features -->
<add key="DefaultPlaceholderCoverModeEnabled" value="False" />
<!-- Rendering -->
<add key="RasterizeVectorInSmartFrame" value="False" />
<add key="ProofImageDownloadEnabled" value="False" />
<add key="SepiaAlgorithm" value="MoreBrown" />
<add key="AppUrl" value="/" />
<add key="DisableHiResOutputEndpoint" value="False" />
<add key="AutoTargetDevicePreviewMode" value="True" />
<!-- Security -->
<add key="ApiSecurityKey" value="" />
<add key="UnsafeHttpWebApiEnabled" value="" />
<add key="SecureModeEnabled" value="True" />
<add key="CorsAllowOriginDomains" value="*" />
<add key="CorsAllowRequestHeaders" value="" />
<add key="CustomersCanvasLicenseKey" value="" />
<add key="IgnoreSslVerification" value="False" />
<!-- Troubleshooting and maintenance -->
<add key="LogCleanUpInterval" value="60" />
<add key="LogLifetimeToArchiving" value="20160" />
<add key="LogLifetimeToRemoving" value="" />
<add key="IssueNotificationEmail" value="" />
<add key="DebugScriptModeEnabled" value="" />
<!-- External state storage -->
<add key="ExternalStatePushUrl" value="https://example.com;" />
<add key="ExternalStatePullUrl" value="https://example.com;" />
<add key="ExternalStateDeleteUrl" value="https://example.com;" />
<add key="ExternalStateSecurityKey" value="UniqueSecurityKey" />
<add key="ExternalStateHeadRequestEnabled" value="True" />
<!-- Asset Manager -->
<add key="AllCategoryName" value="all" />
<add key="RootCategoryName" value="root" />
<add key="OnlyFirstLevelSubfoldersInitialization" value="false" />
<!-- Concurrency -->
<add key="MaxConcurrentRenderingTasks" value="12" />
<add key="MaxConcurrentStateIOTasks" value="4" />
<!-- Authorization -->
<add key="AuthorizationScheme" value="DatabaseTokens" />
<add key="IssuerUrl" value="" />
<add key="PublicKeyFilePath" value="" />
<add key="TokenServiceEndpoint" value="https://localhost/token-service" />
<add key="TokenServiceApiKey" value="" />
<add key="NLog.Loki.Endpoint" value="" />
</appSettings>
All parameters defining paths are either relative or absolute. Relative paths to folders are specified from your site root and start with ~/ (for example, ~/userdata). Absolute paths are complete ones; they start either with a drive letter (for example, C:\) or \\ for network locations. When you use absolute paths to external folders, make sure that the user account, under which Customer's Canvas runs in ASP.NET/IIS, has the read/write access to the remote folders.
If for some reasons the Postscript names are misspelled, then Customer's Canvas adds Arial to the editor's font list and uses this font for substitutions and new text elements.
Let's look at these parameters in more detail.
Paths
Storage
Asset Storage
State file management
| Name | Description | Possible values |
|---|---|---|
| MasterUserId | The identifier of the master user. Templates and images that belong to the master user can be used by any user. The default value is masteruser. | string |
| DefaultUserId | The identifier of the default user. The default value is default. | string |
| StateFileStorageEnabled | Enables the space-saving mode of state files. In this mode, state files are saved in the .sto format. All images are stored in the ..\userdata\StateFileCache\ folder. The default value is False. | True, False |
| AnonymousModeEnabled | Enables the anonymous site mode. The default value is False. For more details, see the Demo mode topic. | True, False |
| DemoModeEnabled | Enables the demonstration mode. The default value is False. For more details, see the Demo mode topic. | True, False |
| HiResControllerStoreDataInState | If True, the HiRes controller saves personalization data in state files when rendering. If False, the state file contains personalized product copies but not the metadata. Default: True. See StoreDataInState. | True, False |
Font management
| Name | Description | Possible values |
|---|---|---|
| FontSubstitutionEnabled | Enables font substitution. If True, substitutes missing fonts instead of throwing an exception. See the Font list article. The default value is False. | True, False |
| SubstitutionFontPostScriptName | The PostScript name of the font to substitute a missing font with. By default, it is the DefaultFontPostScriptName value. | PostScript font name |
| DefaultFontPostScriptName | The PostScript name of the default font used for any new text. The default value is Roboto-Regular. | PostScript font name |
| LoadFontListAsPostScriptNames | If True, allows using PostScript names in the FontList config. If False, reads names as font families. Default: True. | True, False |
| Hinting | Specifies whether to use font hinting. Enabled turns it on, Disabled turns it off. Auto does not force hinting if it is disabled in the font. Default: Auto. | Enabled, Disabled, Auto |
Editor features
| Name | Description | Possible values |
|---|---|---|
| DefaultPlaceholderCoverModeEnabled | Enables the cover mode for image placeholders by default without using the <PACM> marker. The default value is False. | True, False |
Rendering
| Name | Description | Possible values |
|---|---|---|
| RasterizeVectorInSmartFrame | Defines how to import PDF and AI vector graphics from Photoshop templates. If True, Customer's Canvas rasterizes images from smart frames, otherwise, they are loaded in a vector form. The <RVC> marker overrides this parameter. The default value is False. | True, False |
| ProofImageDownloadEnabled | Enables downloading of proof images instead of opening them in a tab when opening a proof image link in a browser. The default value is False. | True, False |
| SepiaAlgorithm | Sets either a standard Sepia algorithm or a custom algorithm giving a more brown tone. MoreBrown is based on Standard with modified hue, contrast, and saturation. By default, the MoreBrown algorithm is enabled. Without this parameter, the Standard algorithm is applied. | Standard, MoreBrown |
| AppUrl | Defines server's URLs that appear in links to proof images and high-resolution outputs. | string |
| DisableHiResOutputEndpoint | Disables the endpoint that generates high resolution print files. By default, the rendering is enabled, and this value is False. | True, False |
| AutoTargetDevicePreviewMode | Enables preview of CMYK colors on the canvas and proof images and uses the profile specified in hiResOutputDestinationColorProfileName for color conversion. By default, this preview mode is enabled, and this value is True. | True, False |
Security
| Name | Description | Possible values |
|---|---|---|
| ApiSecurityKey | Enables access to the Web API. You have to include this key in every header of HTTPS requests as the X-CustomersCanvasAPIKey field. The Web API works if the value of this key passed in a request matches the value defined in web.config. The value is an arbitrary string. For more details, refer to the Authentication topic. | string |
| UnsafeHttpWebApiEnabled | Enables access to the Web API through HTTP. The default value is False, which means you can only call the Customer's Canvas Web API through the secure protocol (HTTPS). | True, False |
| SecureModeEnabled | Enables secure access to the user's private data and the Web API endpoints by using tokens. In this mode, before loading the editor, you have to create a tokenId for a single user and pass this token to the loadeditor method. The default value is True. | True, False |
| CorsAllowOriginDomains | Restricts embedding the editor to pages hosted only on listed domains. If your site and Customer's Canvas run on different domains, you can specify your site domain name here to disallow access from other domains. Comma-separated string. The "*" default value allows access fromлюбого domain. | string |
| CorsAllowRequestHeaders | Restricts HTTP headers, which the Design Editor accepts. By default, only X-CustomersCanvasAPIKey is accepted. To accept other headers, specify them as a comma-separated string. The "*" value allows any HTTP header. | string |
| CustomersCanvasLicenseKey | Applies a license key to the Customer's Canvas instance. | string |
| IgnoreSslVerification | If True, the Web API does not verify certificates of HTTPS addresses of the assets. The default value is False. | True, False |
Logs and Debugging
| Name | Description | Possible values |
|---|---|---|
| LogCleanUpInterval | The interval between cleanup runs, in minutes. Every run, Customer's Canvas verifies whether logs get older than LogLifetimeToArchiving or LogLifetimeToRemoving and triggers archiving or removing. The default value is 60 (an hour). | number |
| LogLifetimeToArchiving | The lifetime of logs before archiving them into the ~/Resources/Logs/Archive folder, in minutes. Elmah does not index files in this folder, which makes the application launch faster. The default value is 20160 (two weeks). | number |
| LogLifetimeToRemoving | The lifetime of logs before removing them from both ~/Resources/Logs/Archive and ~/Resources/Logs folders, in minutes. If LogLifetimeToRemoving is less than LogLifetimeToArchiving, the archive folder will not contain log files. By default, logs are not removed. | number |
| IssueNotificationEmail | Customer's Canvas sends error notifications (initialization errors, missing designs, mockups, or fonts) to this email address. For more details, refer to the Monitoring topic. | string |
| DebugScriptModeEnabled | Enables the Debug mode for loading JavaScript. False enables Release mode (minified and combined scripts). True enables Debug mode (separate files, not minified). If not specified, depends on the application build configuration. | True, False |
| NLog.Loki.Endpoint | The endpoint URL for Loki log collection. Configure this parameter to send NLog output to a Loki instance for centralized log management. | string |
External state storage
| Name | Description | Possible values |
|---|---|---|
| ExternalStatePushUrl | Defines the endpoint of your custom controller that the Design Editor will use to push a state file to external storage. The editor sends a state file to ExternalStatePushUrl and does not save it in its local storage if it receives a success response. You can define this endpoint in your own format, but it must contain {userId} and {stateId} placeholders, for example, "https://example.com{userId}/{stateId}". These placeholders will be replaced with the actual user and state identifiers. You can also specify additional parameters in your request. | string |
| ExternalStatePullUrl | Defines the endpoint of your custom controller that the Design Editor will use to pull a state file from external storage. This endpoint must implement both GET and HEAD methods and must pass the Etag and LastModified headers when responding. This ensures optimal operation and traffic savings. When loading a state file, the editor searches for this file in its local storage and cache first. Then, the editor tries to pull this file from ExternalStatePullUrl. If the state file is not found, an exception occurs. You can define this endpoint in your own format, but it must contain {userId} and {stateId} placeholders, for example, "https://example.com{userId}/{stateId}". These placeholders will be replaced with the actual user and state identifiers. You can also specify additional parameters in your request. | string |
| ExternalStateDeleteUrl | Defines the endpoint of your custom controller that the Design Editor will use to delete a state file from external storage and the cache. You can define this endpoint in your own format, but it must contain {userId} and {stateId} placeholders, for example, "https://example.com{userId}/{stateId}". These placeholders will be replaced with the actual user and state identifiers. You can also specify additional parameters in your request. | string |
| ExternalStateSecurityKey | Defines a security key for your controller processing requests to external state storage. The Design Editor passes this key within the header of HTTPS requests as the X-ExternalStateStorageApiKey field. The value is an arbitrary string. | string |
| ExternalStateHeadRequestEnabled | If you use an outdated implementation of webhooks, set this parameter to False to confirm that the Pull endpoint does not support the HEAD request. However, we strongly recommend updating the webhook to support the HEAD request to optimize performance and reduce traffic. The default value is True. | True, False |