Configuration Examples
Advanced configuration examples for different scenarios, from team collaboration to automation rules.
Complete Workspace Configuration
A comprehensive workspace configuration with all available options.
# complete-workspace.yaml
name: Complete Workspace Example
version: 2.0.0
description: Full-featured workspace with all configuration options
author: Your Team
created: 2025-01-15
# Global workspace settings
settings:
# Localization
timezone: America/New_York
locale: en-US
currency: USD
date_format: MM/DD/YYYY
time_format: 12h
first_day_of_week: 0 # 0=Sunday, 1=Monday
# Workspace preferences
theme: auto # auto, light, dark
accent_color: "#3B82F6"
# Default behaviors
auto_save: true
auto_save_interval: 30 # seconds
enable_offline_mode: true
sync_interval: 60 # seconds
# Collaboration
enable_comments: true
enable_mentions: true
enable_reactions: true
# Security
require_2fa: false
session_timeout: 3600 # seconds
password_policy:
min_length: 8
require_uppercase: true
require_lowercase: true
require_numbers: true
require_special_chars: true
# Workspace members and permissions
members:
- email: admin@example.com
role: admin
display_name: Admin User
- email: developer@example.com
role: member
display_name: Developer
permissions:
- edit_bases
- create_records
- edit_records
- email: viewer@example.com
role: viewer
display_name: Guest Viewer
permissions:
- view_bases
- view_records
# Custom roles
roles:
- name: editor
display_name: Content Editor
permissions:
- view_bases
- create_records
- edit_records
- delete_own_records
- comment
description: Can create and edit content but not delete others' work
- name: analyst
display_name: Data Analyst
permissions:
- view_bases
- export_data
- create_views
description: Read-only access with export capabilities
# Bases (databases)
bases:
- name: Projects
type: project
icon: folder
color: blue
description: Project tracking and management
# Base-level permissions
permissions:
admin: all
member: edit
viewer: view
editor: edit
# Fields
fields:
- name: Project Name
type: text
required: true
unique: true
primary: true
description: The project name
placeholder: Enter project name
- name: Status
type: select
options:
- value: planning
label: Planning
color: gray
- value: active
label: Active
color: green
- value: on_hold
label: On Hold
color: yellow
- value: completed
label: Completed
color: blue
default: planning
required: true
- name: Priority
type: select
options: [High, Medium, Low]
default: Medium
- name: Owner
type: person
required: true
auto_assign: true # Auto-assign to creator
- name: Team
type: multi_person
description: Project team members
- name: Start Date
type: date
required: false
- name: End Date
type: date
validation:
custom: |
// End date must be after start date
if (this.value < record['Start Date']) {
return 'End date must be after start date';
}
- name: Budget
type: number
format: currency
currency: USD
min: 0
max: 1000000
- name: Progress
type: progress
min: 0
max: 100
- name: Description
type: rich_text
enable_markdown: true
- name: Tags
type: multi_select
options:
- Development
- Design
- Marketing
- Research
allow_create: true
- name: Attachments
type: file
allow_multiple: true
max_size: 10485760 # 10MB in bytes
allowed_types:
- .pdf
- .doc
- .docx
- .xls
- .xlsx
- .jpg
- .png
- name: Related Tasks
type: relation
related_base: Tasks
relation_type: has_many
display_field: Task Name
- name: Created By
type: person
auto_fill: creator
readonly: true
- name: Created At
type: date
auto_fill: created_at
readonly: true
include_time: true
- name: Updated At
type: date
auto_fill: updated_at
readonly: true
include_time: true
# Views
views:
- name: All Projects
type: table
default: true
columns:
- Project Name
- Status
- Priority
- Owner
- Progress
sort:
- field: Created At
order: desc
filter: null
- name: Active Projects
type: table
filter:
operator: and
conditions:
- field: Status
operator: equals
value: active
- name: My Projects
type: table
filter:
operator: or
conditions:
- field: Owner
operator: is_current_user
- field: Team
operator: contains_current_user
- name: Status Board
type: kanban
group_by: Status
card_fields:
- Priority
- Owner
- Progress
sort:
- field: Priority
order: asc
- name: Timeline
type: timeline
start_field: Start Date
end_field: End Date
group_by: Owner
color_by: Status
- name: Calendar
type: calendar
date_field: Start Date
end_date_field: End Date
color_by: Status
- name: Gallery
type: gallery
image_field: Cover Image
card_fields:
- Status
- Owner
# Automations
automations:
- name: Notify on Status Change
trigger:
type: record_updated
field: Status
conditions:
- field: Status
operator: equals
value: completed
actions:
- type: send_notification
to: "{{Owner}}"
title: Project Completed
message: "Project {{Project Name}} has been marked as completed!"
- name: Auto-assign Team Lead
trigger:
type: record_created
conditions:
- field: Priority
operator: equals
value: High
actions:
- type: update_field
field: Owner
value: team_lead_email@example.com
# Plugins
plugins:
- name: daily-notes
enabled: true
config:
target_base: Daily Notes
creation_time: "06:00"
template: daily-note-template
- name: slack-notifications
enabled: true
config:
webhook_url: https://hooks.slack.com/services/YOUR/WEBHOOK/URL
channels:
- name: general
events:
- record_created
- record_updated
- name: projects
events:
- status_changed
filters:
base: Projects
- name: backup
enabled: true
config:
schedule: "0 2 * * *" # 2 AM daily
backup_path: ./backups
max_backups: 7
# Automation rules
automation_rules:
- name: Task Due Soon Reminder
enabled: true
trigger:
type: scheduled
schedule: "0 9 * * *" # Every day at 9 AM
conditions:
- base: Tasks
field: Due Date
operator: is_within
value: 2 days
- base: Tasks
field: Status
operator: not_equals
value: Done
actions:
- type: send_notification
to: "{{Assignee}}"
title: Task Due Soon
message: "Task {{Task Name}} is due in {{days_until}} days"
- name: Auto-archive Completed
enabled: true
trigger:
type: scheduled
schedule: "0 0 * * 0" # Weekly on Sunday
conditions:
- field: Status
operator: equals
value: Completed
- field: Completed Date
operator: older_than
value: 30 days
actions:
- type: move_to_base
target: Archive
# Templates
templates:
- name: daily-note-template
type: document
content: |
# {{date}}
## Today's Focus
-
## Notes
## Completed
- [ ]
- name: project-brief-template
type: document
content: |
# Project Brief: {{title}}
## Overview
## Objectives
1.
## Timeline
- Start Date:
- End Date:
## Team
-
## Resources
# Custom fields (reusable field definitions)
custom_fields:
- name: Priority
type: select
options:
- value: critical
label: Critical
color: red
- value: high
label: High
color: orange
- value: medium
label: Medium
color: yellow
- value: low
label: Low
color: gray
- name: Status Badge
type: select
options:
- label: Not Started
color: gray
- label: In Progress
color: blue
- label: Completed
color: green
- label: Blocked
color: red
# Webhooks
webhooks:
- name: External API Sync
url: https://api.example.com/webhook
events:
- record_created
- record_updated
- record_deleted
bases:
- Projects
- Tasks
headers:
Authorization: Bearer YOUR_TOKEN
retry_config:
max_retries: 3
retry_delay: 1000 # ms
# Import/Export settings
import_export:
# CSV settings
csv:
delimiter: ","
quote: "\""
encoding: utf-8
include_header: true
# Export formats
allowed_formats:
- csv
- json
- xlsx
- markdown
# API settings
api:
enabled: true
rate_limit:
requests_per_minute: 60
requests_per_hour: 1000
allowed_origins:
- https://app.example.com
- http://localhost:3000
# Integrations
integrations:
- name: github
enabled: true
config:
token: ghp_YOUR_TOKEN
repositories:
- owner/repo1
- owner/repo2
sync_issues: true
sync_prs: true
- name: google_calendar
enabled: true
config:
calendar_id: primary
sync_direction: both # both, to_lokud, to_calendar
# Notification settings
notifications:
email:
enabled: true
from: noreply@example.com
smtp:
host: smtp.example.com
port: 587
secure: true
auth:
user: smtp_user
pass: smtp_password
push:
enabled: true
service: firebase
config:
server_key: YOUR_SERVER_KEY
slack:
enabled: true
webhook_url: https://hooks.slack.com/services/YOUR/WEBHOOK/URL
# Backup and sync
backup:
auto_backup: true
schedule: "0 2 * * *"
retention_days: 30
include_attachments: true
cloud_sync:
enabled: false
provider: s3
bucket: my-lokud-backups
# Analytics
analytics:
enabled: true
track_events:
- record_created
- record_updated
- user_login
- export_data
dashboards:
- name: Activity Overview
widgets:
- type: counter
title: Total Records
query: count(all_records)
- type: chart
title: Records Created Over Time
chart_type: line
query: count(records_by_date)Team Collaboration Configuration
Optimized for team collaboration with permissions and workflows.
# team-collaboration.yaml
name: Team Workspace
version: 1.0.0
description: Collaborative workspace with role-based access
settings:
timezone: UTC
enable_comments: true
enable_mentions: true
require_2fa: true
# Define custom roles
roles:
- name: team_lead
display_name: Team Lead
permissions:
- all_bases_access
- manage_members
- create_bases
- delete_bases
- manage_automations
- view_analytics
- name: developer
display_name: Developer
permissions:
- view_all_bases
- edit_assigned_records
- create_records
- comment
- export_data
- name: designer
display_name: Designer
permissions:
- view_all_bases
- edit_assigned_records
- create_records
- upload_assets
- comment
- name: client
display_name: Client
permissions:
- view_specific_bases
- comment
- view_assigned_records
restricted_bases:
- Projects
- Deliverables
# Team members
members:
- email: lead@company.com
role: team_lead
display_name: Team Lead
- email: dev1@company.com
role: developer
display_name: Developer 1
teams:
- Engineering
- email: designer1@company.com
role: designer
display_name: Designer 1
teams:
- Design
- email: client@external.com
role: client
display_name: Client
access:
bases:
- Projects
records:
filter:
field: Client
operator: equals
value: client@external.com
# Teams for grouping
teams:
- name: Engineering
members:
- dev1@company.com
- dev2@company.com
bases:
- Development Tasks
- Bugs
- Tech Debt
- name: Design
members:
- designer1@company.com
- designer2@company.com
bases:
- Design Tasks
- Assets
- Style Guide
- name: Management
members:
- lead@company.com
- manager@company.com
bases:
- Projects
- Roadmap
- OKRs
bases:
- name: Projects
permissions:
team_lead: all
developer: view_edit_assigned
designer: view_edit_assigned
client: view_only
fields:
- name: Project Name
type: text
required: true
- name: Client
type: person
required: true
# Only team leads can change
edit_permissions:
- team_lead
- name: Status
type: select
options: [Planning, Active, Review, Completed]
- name: Team Members
type: multi_person
# Auto-filter to team members only
filter_users: true
# Row-level permissions
row_permissions:
- role: developer
condition:
field: Team Members
operator: contains_current_user
- role: client
condition:
field: Client
operator: is_current_user
plugins:
- name: activity-log
enabled: true
config:
track_all_changes: true
notify_team_leads: true
- name: approval-workflow
enabled: true
config:
require_approval:
- base: Projects
field: Status
from: Review
to: Completed
approvers:
- team_leadAutomation Configuration
Advanced automation rules and workflows.
# automation-config.yaml
name: Automated Workspace
version: 1.0.0
description: Workspace with extensive automation
automation_rules:
# Auto-assign tasks based on workload
- name: Smart Task Assignment
enabled: true
trigger:
type: record_created
base: Tasks
actions:
- type: run_script
script: |
// Get all team members
const members = await lokud.getMembers();
// Count active tasks per member
const taskCounts = {};
for (const member of members) {
const tasks = await lokud.query('Tasks', {
filter: {
Assignee: member.email,
Status: { not_equals: 'Done' }
}
});
taskCounts[member.email] = tasks.length;
}
// Find member with least tasks
const assignee = Object.keys(taskCounts).reduce((a, b) =>
taskCounts[a] < taskCounts[b] ? a : b
);
// Assign task
await record.update({ Assignee: assignee });
# Escalate overdue tasks
- name: Overdue Task Escalation
enabled: true
trigger:
type: scheduled
schedule: "0 10 * * *" # Daily at 10 AM
conditions:
- base: Tasks
field: Due Date
operator: is_before
value: today
- base: Tasks
field: Status
operator: not_equals
value: Done
- base: Tasks
field: Priority
operator: not_equals
value: High
actions:
- type: update_field
field: Priority
value: High
- type: send_notification
to: "{{Assignee}}"
cc: "{{Manager}}"
title: Overdue Task Escalation
message: "Task '{{Task Name}}' is overdue and has been escalated to High priority"
# Auto-create follow-up tasks
- name: Create Follow-up Tasks
enabled: true
trigger:
type: record_updated
base: Meetings
field: Status
new_value: Completed
conditions:
- field: Action Items
operator: is_not_empty
actions:
- type: run_script
script: |
// Parse action items
const actionItems = record['Action Items'].split('\n');
// Create task for each action item
for (const item of actionItems) {
if (item.trim()) {
await lokud.createRecord('Tasks', {
'Task Name': item.trim(),
'Source': 'Meeting: ' + record['Meeting Title'],
'Status': 'To Do',
'Due Date': record['Follow-up Date'],
'Related Meeting': record.id
});
}
}
# Status change notifications
- name: Status Change Workflow
enabled: true
trigger:
type: record_updated
base: Projects
field: Status
actions:
# When moved to Active
- type: conditional
condition:
field: Status
operator: equals
value: Active
actions:
- type: send_notification
to: "{{Team Members}}"
title: Project Started
message: "Project '{{Project Name}}' is now active!"
- type: update_field
field: Start Date
value: today
# When moved to Completed
- type: conditional
condition:
field: Status
operator: equals
value: Completed
actions:
- type: send_notification
to: "{{Owner}}"
title: Project Completed
message: "Congratulations! Project '{{Project Name}}' is complete."
- type: update_field
field: Completion Date
value: today
- type: run_script
script: |
// Calculate project metrics
const startDate = new Date(record['Start Date']);
const endDate = new Date(record['Completion Date']);
const duration = Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24));
await record.update({
'Duration (days)': duration
});
# Data validation and cleanup
- name: Data Cleanup
enabled: true
trigger:
type: scheduled
schedule: "0 0 * * 0" # Weekly on Sunday
actions:
- type: run_script
script: |
// Remove old records
const cutoffDate = new Date();
cutoffDate.setMonth(cutoffDate.getMonth() - 6);
const oldRecords = await lokud.query('Archive', {
filter: {
'Archived Date': { before: cutoffDate }
}
});
for (const record of oldRecords) {
await lokud.deleteRecord('Archive', record.id);
}
console.log(`Deleted ${oldRecords.length} old records`);
# Cross-base automation
- name: Sync Related Records
enabled: true
trigger:
type: record_updated
base: Projects
field: Budget
actions:
- type: run_script
script: |
// Update all related tasks
const tasks = await lokud.query('Tasks', {
filter: {
'Project': record.id
}
});
const budgetPerTask = record['Budget'] / tasks.length;
for (const task of tasks) {
await lokud.updateRecord('Tasks', task.id, {
'Allocated Budget': budgetPerTask
});
}
# Scheduled jobs
scheduled_jobs:
- name: Daily Standup Reminder
schedule: "0 9 * * 1-5" # Weekdays at 9 AM
action:
type: send_notification
to: "@team"
title: Daily Standup
message: "Time for daily standup! Share your updates in #standup"
- name: Weekly Report
schedule: "0 17 * * 5" # Friday at 5 PM
action:
type: run_script
script: |
// Generate weekly report
const startOfWeek = lokud.utils.startOfWeek(new Date());
const endOfWeek = lokud.utils.endOfWeek(new Date());
const completedTasks = await lokud.query('Tasks', {
filter: {
'Status': 'Done',
'Completion Date': {
between: [startOfWeek, endOfWeek]
}
}
});
const report = {
week: lokud.utils.getWeekNumber(new Date()),
completed: completedTasks.length,
tasks: completedTasks.map(t => t['Task Name'])
};
await lokud.createRecord('Weekly Reports', report);
- name: Backup Reminder
schedule: "0 18 * * *" # Daily at 6 PM
action:
type: check_and_notify
check: last_backup_time
threshold: 24 hours
notification:
title: Backup Overdue
message: "Workspace hasn't been backed up in 24 hours"
priority: highAPI Configuration
Configure API access and webhooks.
# api-config.yaml
name: API-Enabled Workspace
version: 1.0.0
api:
enabled: true
version: v1
# Authentication
authentication:
methods:
- api_key
- oauth2
- jwt
api_keys:
- name: Production App
key: lok_prod_xxxxxxxxxxxxx
permissions:
- read:all
- write:tasks
- write:projects
rate_limit: 1000 # per hour
- name: Analytics Service
key: lok_analytics_xxxxxxxxxxxxx
permissions:
- read:all
rate_limit: 5000
oauth2:
enabled: true
client_id: your_client_id
client_secret: your_client_secret
scopes:
- read:bases
- write:records
- admin:workspace
# Rate limiting
rate_limiting:
enabled: true
default_limit: 60 # requests per minute
burst_limit: 100
by_ip: true
by_api_key: true
# CORS
cors:
enabled: true
allowed_origins:
- https://app.example.com
- https://dashboard.example.com
allowed_methods:
- GET
- POST
- PUT
- PATCH
- DELETE
allowed_headers:
- Content-Type
- Authorization
expose_headers:
- X-Total-Count
- X-Page-Number
credentials: true
max_age: 86400
# Webhooks
webhooks:
- name: Primary Webhook
url: https://api.example.com/webhooks/lokud
events:
- record.created
- record.updated
- record.deleted
bases:
- Tasks
- Projects
headers:
Authorization: Bearer your_token
X-Custom-Header: value
retry_policy:
max_attempts: 3
backoff: exponential
initial_delay: 1000 # ms
- name: Analytics Webhook
url: https://analytics.example.com/events
events:
- record.created
- record.updated
bases: all
transform: |
// Transform data before sending
return {
event: event.type,
timestamp: new Date().toISOString(),
base: event.base,
record_id: event.record.id,
changes: event.changes
};
# API endpoints customization
endpoints:
# Custom endpoint
- path: /api/v1/custom/summary
method: GET
handler: |
async function handler(request, response) {
const projects = await lokud.query('Projects', {
filter: { Status: 'Active' }
});
const tasks = await lokud.query('Tasks', {
filter: { Status: { not_equals: 'Done' } }
});
return {
active_projects: projects.length,
pending_tasks: tasks.length,
timestamp: new Date().toISOString()
};
}
# Override default endpoint
- path: /api/v1/bases/:base/records
method: POST
middleware:
- validate_input
- check_permissions
handler: custom_create_record
# External integrations
integrations:
- name: Zapier
enabled: true
webhook_url: https://hooks.zapier.com/hooks/catch/xxxxx/
- name: Make (Integromat)
enabled: true
webhook_url: https://hook.integromat.com/xxxxx/
- name: n8n
enabled: true
config:
instance_url: https://n8n.example.com
api_key: your_n8n_api_keyMulti-Environment Configuration
Manage different environments (dev, staging, production).
# base-config.yaml
extends: null
environment: ${LOKUD_ENV}
environments:
development:
settings:
debug: true
log_level: debug
auto_save_interval: 10
api:
rate_limiting:
enabled: false
databases:
connection: sqlite:./dev.db
notifications:
email:
enabled: false
staging:
settings:
debug: true
log_level: info
auto_save_interval: 30
api:
rate_limiting:
enabled: true
default_limit: 100
databases:
connection: postgresql://staging-db
notifications:
email:
enabled: true
smtp:
host: smtp-staging.example.com
production:
settings:
debug: false
log_level: warn
auto_save_interval: 60
api:
rate_limiting:
enabled: true
default_limit: 60
databases:
connection: postgresql://prod-db
pool_size: 20
backup:
enabled: true
schedule: "0 */6 * * *" # Every 6 hours
notifications:
email:
enabled: true
smtp:
host: smtp.example.com
slack:
enabled: true
sms:
enabled: trueSecurity Configuration
Enhanced security settings.
# security-config.yaml
name: Secure Workspace
version: 1.0.0
security:
# Authentication
authentication:
require_2fa: true
password_policy:
min_length: 12
require_uppercase: true
require_lowercase: true
require_numbers: true
require_special_chars: true
prevent_common_passwords: true
password_history: 5 # Can't reuse last 5 passwords
session:
timeout: 1800 # 30 minutes
absolute_timeout: 43200 # 12 hours
remember_me: false
lockout:
enabled: true
max_attempts: 5
lockout_duration: 900 # 15 minutes
# Encryption
encryption:
at_rest: true
algorithm: AES-256-GCM
key_rotation: 90 # days
encrypted_fields:
- base: Customers
fields:
- SSN
- Credit Card
- base: Employees
fields:
- Salary
- Personal Info
# Access control
access_control:
ip_whitelist:
- 192.168.1.0/24
- 10.0.0.0/8
require_vpn: true
# Field-level permissions
field_permissions:
- base: Employees
field: Salary
read: [admin, hr]
write: [admin]
# Audit logging
audit_log:
enabled: true
log_events:
- login
- logout
- failed_login
- record_created
- record_updated
- record_deleted
- permission_changed
- export_data
retention_days: 365
export_format: json
# Data privacy
privacy:
gdpr_compliance: true
ccpa_compliance: true
# Automatic PII detection
pii_detection: true
pii_fields:
- email
- phone
- ssn
- address
# Data retention
data_retention:
- base: User Activity
retention_days: 90
auto_delete: true
- base: Audit Logs
retention_days: 365
auto_archive: trueThese configuration examples provide comprehensive setups for various scenarios. Copy and customize them based on your specific needs!