Appearance
Settings API
The Settings API lets a tool persist user preferences across sessions — things like page size, theme, and grid configuration — keyed per tool. This page covers the four core methods, the best practices the documentation recommends, and worked examples for common preference-storage scenarios.
Use get/set/getAll/setAll for user preferences only — never for transient application state (current page number, selected rows) — and always namespace keys (ui.pageSize, not pageSize) and supply a default when reading, since a setting may not exist yet.
Reading settings
toolboxAPI.settings.getAll()
Requires v1.0.17
Retrieves all settings for your tool.
Returns: Promise<Record<string, any>> — object containing all settings key-value pairs
javascript
const settings = await toolboxAPI.settings.getAll()
console.log('All settings:', JSON.stringify(settings))
// Example output:
// {
// "pageSize": 50,
// "defaultColor": "blue",
// "showAdvancedOptions": true,
// "lastUsedFilter": "active"
// }toolboxAPI.settings.get(key)
Requires v1.0.17
Retrieves a specific setting by key.
Parameters: key: string — the setting key to retrieve Returns: Promise<any> — value of the setting, or undefined if not found
javascript
const pageSize = await toolboxAPI.settings.get('pageSize')
console.log('Page Size setting:', pageSize) // Output: 50
// Handle missing settings with defaults
const pageSize2 = (await toolboxAPI.settings.get('pageSize')) || 25
const theme = (await toolboxAPI.settings.get('theme')) || 'light'Writing settings
toolboxAPI.settings.set(key, value)
Requires v1.0.17
Sets a specific setting by key. value is serialized to JSON.
Parameters: key: string, value: anyReturns: Promise<void>
javascript
await toolboxAPI.settings.set('pageSize', 50)
await toolboxAPI.settings.set('defaultColor', 'blue')
await toolboxAPI.settings.set('showAdvancedOptions', true)
// Store complex objects
await toolboxAPI.settings.set('lastFilter', {
type: 'status',
value: 'active',
appliedAt: new Date().toISOString(),
})toolboxAPI.settings.setAll(settings)
Requires v1.0.17
Sets multiple settings at once — use this for batch updates instead of several sequential set() calls.
Parameters: settings: Record<string, any>Returns: Promise<void>
javascript
await toolboxAPI.settings.setAll({
defaultColor: 'blue',
pageSize: 50,
showAdvancedOptions: true,
lastUsedFilter: 'active',
})Best practices
Use meaningful keys
Use descriptive, namespaced keys to avoid conflicts:
javascript
// Good: Descriptive keys
await toolboxAPI.settings.set('ui.pageSize', 50)
await toolboxAPI.settings.set('ui.theme', 'dark')
await toolboxAPI.settings.set('data.cacheExpiry', 3600)
// Bad: Vague keys
await toolboxAPI.settings.set('size', 50)
await toolboxAPI.settings.set('value', 'dark')Provide default values
Always provide fallback values when reading settings:
javascript
// Good: Default values
const pageSize = (await toolboxAPI.settings.get('pageSize')) || 25
const theme = (await toolboxAPI.settings.get('theme')) || 'light'
// Even better: Use a defaults object
const DEFAULTS = {
pageSize: 25,
theme: 'light',
showWelcome: true,
}
async function getSetting(key) {
const value = await toolboxAPI.settings.get(key)
return value !== undefined ? value : DEFAULTS[key]
}Validate settings
Validate settings before using them:
javascript
async function getPageSize() {
const pageSize = await toolboxAPI.settings.get('pageSize')
if (typeof pageSize === 'number' && pageSize > 0 && pageSize <= 100) {
return pageSize
}
return 25
}Batch updates
When updating multiple settings, use setAll() for better performance:
javascript
// Good: Batch update
await toolboxAPI.settings.setAll({
pageSize: 50,
sortColumn: 'name',
sortDirection: 'asc',
filters: { status: 'active' },
})
// Bad: Multiple individual updates
await toolboxAPI.settings.set('pageSize', 50)
await toolboxAPI.settings.set('sortColumn', 'name')
await toolboxAPI.settings.set('sortDirection', 'asc')
await toolboxAPI.settings.set('filters', { status: 'active' })Store only user preferences
Store only user preferences, not application state or temporary data:
javascript
// Good: User preferences
await toolboxAPI.settings.set('defaultView', 'grid')
await toolboxAPI.settings.set('itemsPerPage', 50)
// Bad: Temporary/application state (use local state instead)
await toolboxAPI.settings.set('currentPageNumber', 3)
await toolboxAPI.settings.set('selectedItems', [1, 2, 3])Handle errors
Always handle potential errors when working with settings:
javascript
try {
await toolboxAPI.settings.set('pageSize', 50)
} catch (error) {
console.error('Failed to save setting:', error)
await toolboxAPI.utils.showNotification({
title: 'Error',
body: 'Failed to save preferences',
type: 'error',
})
}Examples
Save and load form preferences
javascript
// Save form state
async function saveFormPreferences(formData) {
await toolboxAPI.settings.setAll({
'form.defaultEnvironment': formData.environment,
'form.showAdvanced': formData.showAdvanced,
'form.autoRefresh': formData.autoRefresh,
})
}
// Load form state
async function loadFormPreferences() {
const settings = await toolboxAPI.settings.getAll()
return {
environment: settings['form.defaultEnvironment'] || 'production',
showAdvanced: settings['form.showAdvanced'] || false,
autoRefresh: settings['form.autoRefresh'] || true,
}
}Theme preference
javascript
// Apply and save theme preference
async function setTheme(theme) {
document.body.classList.remove('theme-light', 'theme-dark')
document.body.classList.add(`theme-${theme}`)
await toolboxAPI.settings.set('ui.theme', theme)
}
// Load theme on startup
async function loadTheme() {
const theme = (await toolboxAPI.settings.get('ui.theme')) || 'light'
document.body.classList.add(`theme-${theme}`)
}Data grid preferences
javascript
// Save grid configuration
async function saveGridConfig(config) {
await toolboxAPI.settings.setAll({
'grid.pageSize': config.pageSize,
'grid.sortColumn': config.sortColumn,
'grid.sortDirection': config.sortDirection,
'grid.visibleColumns': config.visibleColumns,
'grid.density': config.density,
})
}
// Load grid configuration
async function loadGridConfig() {
const settings = await toolboxAPI.settings.getAll()
return {
pageSize: settings['grid.pageSize'] || 25,
sortColumn: settings['grid.sortColumn'] || 'name',
sortDirection: settings['grid.sortDirection'] || 'asc',
visibleColumns: settings['grid.visibleColumns'] || ['name', 'status', 'date'],
density: settings['grid.density'] || 'comfortable',
}
}Checklist
- [ ] Setting keys are namespaced (
ui.pageSize,grid.sortColumn) rather than generic (size,value). - [ ] Every
get()call has a fallback default for the case where the setting hasn't been set yet. - [ ] Values are validated (type and range) before use, not trusted blindly.
- [ ] Multiple related settings are written with
setAll()instead of sequentialset()calls. - [ ] Only durable user preferences are stored — transient UI state (current page, selection) stays in local component state.
- [ ]
settings.set()/setAll()calls are wrapped in try/catch with user-facing error feedback. - [ ] Your tool listens for the
settings:updatedevent (see Events API) if it needs to react to settings changed elsewhere.