Log and search user actions in the database
Key Features
- Log actions with timestamps and types
- Search action history by type, term, and date range
- SQL database backed storage
- Web UI for viewing action logs
Log and search user actions in the database
Key Features
- Log actions with timestamps and types
- Search action history by type, term, and date range
- SQL database backed storage
- Web UI for viewing action logs
Server-Side Usage:
// Get the ActionLog API
var ActionLog = js.getObject("/OpenForum/AddOn/ActionLog","ActionLog.sjs");
// Log an action
ActionLog.logAction("USER_LOGIN", "User john.doe logged in");
// Search actions
var results = ActionLog.search("USER_LOGIN", "john", fromTimestamp, toTimestamp);
Configuration
- Requires SQL database configured
- Uses `action_log` table
Action Log - Quick Reference
/OpenForum/AddOn/ActionLog Sevice API Version 0.0.7
Get Actions
Action search
Parameters
| Name | Description |
| actionType (required=false) | {{parameter.description}} |
| term (required=false) | {{parameter.description}} |
| fromTs (required=false) | {{parameter.description}} |
| toTs (required=false) | {{parameter.description}} |
Example Get Request
/OpenForum/AddOn/ActionLog?action=search
Example Response
Example Error Response
Post Actions
Action logAction
{{action.description}}
Parameters
| Name | Description |
| actionType (required=true) | {{parameter.description}} |
| action (required=true) | {{parameter.description}} |
Example Post Request
/OpenForum/AddOn/ActionLog?action=logAction
Example Response
Example Error Response
×
Quick Reference Open in a new tab
Monitor and alert on triggers, heartbeats, and alarms
Key Features
- Three alert types: Triggers, Heart Beat monitors, and Alarms
- Configurable alert and escalation times
- Tag-based alert organization
- State tracking (OK, Triggered, Escalated)
- Web UI for alert management
Monitor and alert on triggers, heartbeats, and alarms
Key Features
- Three alert types: Triggers, Heart Beat monitors, and Alarms
- Configurable alert and escalation times
- Tag-based alert organization
- State tracking (OK, Triggered, Escalated)
- Web UI for alert management
Alert Types:
- Trigger** - Fires when specific condition occurs
- Heart Monitor** - Monitors periodic heartbeat signals
- Alarm** - Time-based alarm notifications
Server-Side Usage:
// Get the Alert API
var Alert = js.getObject("/OpenForum/AddOn/Alert","Alert.sjs");
// Add an alert
Alert.addAlert("ServerHealth", "heartMonitor", 60000, 300000);
// Trigger an alert
Alert.trigger("ServerHealth");
// Send heartbeat
Alert.beat("ServerHealth");
// Get alerts by tag
var alerts = Alert.getAlerts("production");
/OpenForum/AddOn/Alert Sevice API Version 1.0.7
Get Actions
Action triggerAlert
Parameters
| Name | Description |
| name (required=true) | {{parameter.description}} |
| reason (required=true) | {{parameter.description}} |
Example Get Request
/OpenForum/AddOn/Alert?action=triggerAlert
Example Response
Example Error Response
Action getTags
Parameters
| Name | Description |
| alertName (required=true) | {{parameter.description}} |
Example Get Request
/OpenForum/AddOn/Alert?action=getTags
Example Response
Example Error Response
Post Actions
×
Quick Reference Open in a new tab
The audio monitor enables the monitoring of volume levels from the microphone.
Quick Reference
The audio monitor enables the monitoring of volume levels from the microphone.
×
Quick Reference Open in a new tab
The audio recorder enables the recording of audio files that can be saved to the server or downloaded.
Quick Reference
The audio recorder enables the recording of audio files that can be saved to the server or downloaded.
×
Quick Reference Open in a new tab
Visual content editor for creating and editing page content
Key Features
- Block-based content editing
- Visual page builder
- Drag-and-drop interface
- Multiple content block types
Visual content editor for creating and editing page content
Key Features
- Block-based content editing
- Visual page builder
- Drag-and-drop interface
- Multiple content block types
Client-Side Usage:
// Content editor is initialized in #pageEditor element
// See page.js for initialization details
Use Cases
- Page creation
- Content layout design
- Visual editing
- Block-based content management
//OpenForum/AddOn/ContentEditor/QuickReference/page.js
OpenForum.init = function() {
};
×
Quick Reference Open in a new tab
Central data management and table-based data storage
Key Features
- Table-based data organization
- JSON data storage
- CRUD operations on datasets
- Web UI for data management
DataCentral Quick Reference
Central data management and table-based data storage
Key Features
- Table-based data organization
- JSON data storage
- CRUD operations on datasets
- Web UI for data management
Client-Side Usage:
// Uses OpenForum Table extension
// Data stored in table format
// See table-definition.txt for structure
Use Cases
- Central data repository
- Shared data storage
- Structured data management
//OpenForum/AddOn/DataCentral/QuickReference/page.js
×
Quick Reference Open in a new tab
Upload, process, and categorize images in OpenForum
Key Features
- Batch image upload and processing
- Automatic image categorization and tagging
- Thumbnail generation
- Image format conversion
- EXIF data extraction
- Organize images by category
ImageProcessor Quick Reference
Upload, process, and categorize images in OpenForum
Key Features
- Batch image upload and processing
- Automatic image categorization and tagging
- Thumbnail generation
- Image format conversion
- EXIF data extraction
- Organize images by category
Server-Side Usage:
// Get the ImageProcessor API
var ImageProcessor = js.getObject("/OpenForum/AddOn/ImageProcessor","ImageProcessor.sjs");
// Process uploaded image
ImageProcessor.processImage("/MyPage", "image.jpg", {
createThumbnail: true,
maxWidth: 1024,
category: "photos"
});
// Generate thumbnail
ImageProcessor.createThumbnail("/MyPage", "image.jpg", 200, 200);
// Extract EXIF data
var exif = ImageProcessor.getExifData("/MyPage", "image.jpg");
Client-Side Upload:
// Upload and process image
var formData = new FormData();
formData.append('image', fileInput.files0);
formData.append('category', 'photos');
JSON.post('/OpenForum/AddOn/ImageProcessor/Upload', null, formData)
.onSuccess(function(result) {
console.log('Image processed:', result);
}).go();
Configuration
- Configure thumbnail sizes and quality
- Set default image categories
- Define processing rules and filters
×
Quick Reference Open in a new tab
Notes
Quick Reference Open in a new tab
PaperScape
PaperScape Quick Reference
PaperScape Quick Reference
Cheat sheet for everyday scene authors working inside the PaperScape canvas.
Launch & Layout
- Open
/OpenForum/AddOn/PaperScape; the canvas fills the viewport and the off-canvas menu toggles with the hamburger icon.
- Use the mouse wheel (or pinch) to zoom; drag the backdrop to pan while no items are selected.
- Toggle full screen via Actions → Full Screen for maximum space.
Working with Items
- Drag files onto the canvas:
.giraffe.js components, .giraffe.json scenes, or images (JPG/PNG/SVG/WEBP).
- Each drop appears under Items in the side menu so you can reopen its edit window.
- Select an item and press Delete (or use the edit modal) to remove it.
- Need precision? Enable select-box via developer tools, or add snap-to-grid through custom scripts.
Saving & Loading
- Use Actions → Save to persist the current scene into
paperScape.json.
- Use Actions → Load to reload the saved scene. Note: loading currently adds to existing items; clear the canvas first.
- Saved images are embedded as data URLs; large assets will increase load/save time.
Editing Items
- Many components expose a modal configuration form. Click their entry in the side menu to reopen it.
- Use the Remove button inside the modal to delete the item and close the dialog.
- Measure tool: adjust the end points, open its modal to rename, change units, and recalibrate distance.
- Whiteboard: click a coloured circle to change pen width/color; draw by dragging on the board.
Developer Utilities
- Open Developer Console for the dual editors.
- Run executes the JavaScript editor content inside the live PaperScape instance.
- The JSON editor is handy for crafting
.giraffe.json snippets and sending them over IntraQ.
Queue Automation
- PaperScape now listens on the
PaperScape IntraQ queue—the same tab-to-tab bus used elsewhere in OpenForum.
- Load
/OpenForum/AddOn/PaperScape/paperscape-queue.js and run var psq = new PaperScapeQueue(); to start broadcasting.
psq.sendUrl("/OpenForum/AddOn/PaperScape/Apps/object-model-view.giraffe.js") queues a drop exactly like dragging the file onto the canvas.
psq.sendFile(fileInput.files0, {pointer:{x:300,y:200}}) converts any supported file into a data URL and spawns it near the chosen coordinates (defaults to the canvas centre).
psq.sendCode(editor.getValue(), {name:"Workflow Builder", replace:true}) hot-swaps custom apps—ideal for iterative development.
- Queued loads append just like manual drops; clear the canvas first when you intend to fully replace a scene.
Object Model Toolkit
- Drop
/HomeLab/ObjectModelView/object-model-view.giraffe.js to embed the editable object model canvas.
- Drag
.omv.json files/URLs onto the canvas to import or replace the current model—PaperScape prompts you before applying changes.
- Top-left controls include Save Model (server path), Open Model (file picker with import/replace), Download (save JSON to desktop), and New Model (blank scene with suggested file name).
- PaperScape reminds you if a file name does not end with
.omv.json so downloads and drops keep working everywhere.
- Use the + New Entity control button (top-left overlay) to spawn a new class box; it drops near the viewport centre.
- Hover an entity title to reveal the ✎ icon—click it to rename the entity or manage fields and methods. Identifiers must be unique.
- Hover the bottom-right ⇄ icon to add relationships: choose a target entity and type (association, inheritance, composition); existing links can be removed from the same dialog.
Tips
- Keep a backup of
paperScape.json before experimenting; there is no version history yet.
- Only load trusted
.giraffe.js files—drops execute code instantly.
- If the Items menu stops updating, refresh the page; duplicated load actions can confuse the registry.
×
Quick Reference Open in a new tab
Publisher
(
Publisher promotes any /... page hierarchy to production by copying it without the /Development prefix so work-in-progress stays isolated.
Every text-based attachment is rewritten so `"/"` links become live paths, and optional rules in `development-translation.sjs` can further transform each file.
Practice publishes generate release notes plus a deletions script preview without touching the live site; the real publish copies files and appends removal commands into `process-deletions.sjs` for manual execution.
QuickReference
(
Publisher promotes any /... page hierarchy to production by copying it without the /Development prefix so work-in-progress stays isolated.
Every text-based attachment is rewritten so `"/"` links become live paths, and optional rules in `development-translation.sjs` can further transform each file.
Practice publishes generate release notes plus a deletions script preview without touching the live site; the real publish copies files and appends removal commands into `process-deletions.sjs` for manual execution.
Actions
- Check for Page Differences – Compares timestamps and hashes between the /Development tree and its published counterpart so you can see what will change.
- Reverse Publish – Copies the published page back into /Development to recover live edits or restart from a known-good state.
- Publish Page (practice) – Runs the full translation/diff pipeline, writes detailed release notes, but skips copying so you can verify the impact.
- Publish Page (for real) – Performs the same checks and then copies the files, applies path rewrites, generates release notes, and refreshes the published page.
Special files
- development-translation.sjs – Optional script invoked per text file; receives the file contents as `data` and must return the transformed string.
- publish-config.json – JSON blob for exclusions, e.g. `{"excludedFiles":"do-not-publish.me"}`; also expands the standard exclusion list.
- do-not-release.txt – Presence blocks publishing and should describe why the page is locked.
- process-deletions.sjs – Auto-generated script listing live files to delete after you verify them; run manually once you are satisfied.
- release-notes.html.fragment – Captures the accordion-style log of each publish run for auditing.
Usage tips
- Publish from the root /... page you want to release; sub pages are handled automatically.
- Always inspect the practice-mode release notes before running the real publish so you catch unexpected deletions or TODO markers.
- Keep the generated deletions script in source control (or review it) before executing so you have an audit trail of removed files.
×
Quick Reference Open in a new tab
RemoteAdministration
Remote administration and management of OpenForum servers
Key Features
- Remote server management
- Execute administrative tasks remotely
- Monitor server status
- Manage multiple OpenForum instances
- Remote configuration updates
- Server health checks
- User management across servers
RemoteAdministration Quick Reference
Remote administration and management of OpenForum servers
Key Features
- Remote server management
- Execute administrative tasks remotely
- Monitor server status
- Manage multiple OpenForum instances
- Remote configuration updates
- Server health checks
- User management across servers
Server-Side Usage:
// Get the RemoteAdministration API
var RemoteAdmin = js.getObject("/OpenForum/AddOn/RemoteAdministration","RemoteAdministration.sjs");
// Execute remote command
RemoteAdmin.executeCommand("serverUrl", "command", parameters);
// Get server status
var status = RemoteAdmin.getServerStatus("serverUrl");
// Update remote configuration
RemoteAdmin.updateConfig("serverUrl", configData);
// Manage remote users
RemoteAdmin.createUser("serverUrl", "username", "password");
RemoteAdmin.deleteUser("serverUrl", "username");
Client-Side Usage:
// Execute remote command
JSON.post('/OpenForum/AddOn/RemoteAdministration/Execute', null,
'server=' encodeURIComponent('https://remote-server.com')
'&command=restart')
.onSuccess(function(result) {
console.log('Command executed:', result);
}).go();
// Get server status
JSON.get('/OpenForum/AddOn/RemoteAdministration/Status', null,
'server=' encodeURIComponent('https://remote-server.com'))
.onSuccess(function(status) {
console.log('Server status:', status);
}).go();
Configuration
- Authorized server list
- Authentication credentials
- Command permissions
- Timeout settings
- SSL/TLS configuration
×
Quick Reference Open in a new tab
RemoteLogger
Centralized logging system for collecting logs from remote OpenForum servers
Key Features
- Collect logs from remote servers
- Centralized log aggregation
- Remote error tracking
- Log filtering and search
- Real-time log streaming
- Log level management
- Multi-server log consolidation
RemoteLogger Quick Reference
Centralized logging system for collecting logs from remote OpenForum servers
Key Features
- Collect logs from remote servers
- Centralized log aggregation
- Remote error tracking
- Log filtering and search
- Real-time log streaming
- Log level management
- Multi-server log consolidation
Server-Side Usage:
// Get the RemoteLogger API
var RemoteLogger = js.getObject("/OpenForum/AddOn/RemoteLogger","RemoteLogger.sjs");
// Send log to remote logger
RemoteLogger.log("INFO", "My log message");
RemoteLogger.error("Error message");
RemoteLogger.warn("Warning message");
RemoteLogger.debug("Debug message");
// Log with context
RemoteLogger.log("INFO", "User action", {
user: "username",
action: "login",
timestamp: new Date().getTime()
});
// Get logs
var logs = RemoteLogger.getLogs({
level: "ERROR",
startTime: startTimestamp,
endTime: endTimestamp
});
Client-Side Usage:
// Send log message
JSON.post('/OpenForum/AddOn/RemoteLogger/Log', null,
'level=INFO&message=' encodeURIComponent('Log message'))
.onSuccess(function(result) {
console.log('Log sent');
}).go();
// Get logs
JSON.get('/OpenForum/AddOn/RemoteLogger/Get', null,
'level=ERROR&limit=100')
.onSuccess(function(logs) {
console.log('Logs:', logs);
}).go();
Log Levels
- DEBUG - Detailed debugging information
- INFO - General informational messages
- WARN - Warning messages
- ERROR - Error messages
- FATAL - Critical error messages
Configuration
- Remote logger endpoint URL
- Log level filtering
- Log retention period
- Maximum log size
- Authentication credentials
×
Quick Reference Open in a new tab
SQL
QuickReference
Server Side
Include DB.sjs on your sjs file
var DB = js.getObject("/OpenForum/AddOn/SQL","DB.sjs");
DB.setAlias("your database name");
// Create a new DB object for each database you need access to
Create a Simple DB Select
var sql = {
action: "select",
table: "my_table",
columns:
"column_a", "column_b"
};
var rows = DB.execute( SQL );
Create a DB Select that returns all columns
var sql = {
action: "select",
table: "my_table"
};
var rows = DB.execute( SQL );
Create a Simple DB Insert
var sql = {
action: "insert",
table: "my_table",
data: {
column_a: "value a",
column_b: "value b"
}
};
DB.execute( SQL );
Create a Simple DB Insert that returns a column
var sql = {
action: "insert",
table: "my_table",
data: {
column_a: "value a",
column_b: "value b"
},
returnColumn: "column_c"
};
var returnedColumn = DB.execute( SQL );
Create a Simple DB Delete
var sql = {
action: "delete",
table: "my_table",
where: {
column_a: "value a",
column_b: "value b"
}
};
DB.execute( SQL );
Create a Simple DB Upsert
var sql = {
action: "upsert",
table: "my_table",
data: {
column_a: "value a",
column_b: "value b",
column_c: "value c",
column_d: "value d"
},
where: {
column_a: "value a",
column_b: "value b"
}
};
DB.execute( SQL );
Create a Simple DB Query
var sql = {
query: "select column_c, column_d from my_table where a = { {valueA} } and b = { {valueB} }
data: {
valueA: "value a",
valueB: "value b"
}
};
DB.execute( SQL );
×
Quick Reference Open in a new tab
ServiceBuilder
Spider
Tagging
Tag and categorize OpenForum pages for better organization and discovery
Key Features
- Add tags to pages
- List all tags
- Find pages by tag
- Tag cloud generation
- Remove tags from pages
- Tag management interface
- Search by multiple tags
Tagging Quick Reference
Tag and categorize OpenForum pages for better organization and discovery
Key Features
- Add tags to pages
- List all tags
- Find pages by tag
- Tag cloud generation
- Remove tags from pages
- Tag management interface
- Search by multiple tags
Server-Side Usage:
// Get the Tagging API
var Tagging = js.getObject("/OpenForum/AddOn/Tagging","Tagging.sjs");
// Add tag to page
Tagging.addTag("/MyPage", "tutorial");
// Add multiple tags
Tagging.addTags("/MyPage", "tutorial", "beginner", "javascript");
// Remove tag from page
Tagging.removeTag("/MyPage", "tutorial");
// Get all tags for a page
var tags = Tagging.getTags("/MyPage");
// Find pages with tag
var pages = Tagging.findPagesWithTag("tutorial");
// Get all tags in system
var allTags = Tagging.getAllTags();
// Get tag cloud (tags with counts)
var tagCloud = Tagging.getTagCloud();
Client-Side Usage:
// Add tag to page
JSON.post('/OpenForum/AddOn/Tagging/Add', null,
'pageName=/MyPage&tag=tutorial')
.onSuccess(function(result) {
console.log('Tag added');
}).go();
// Get tags for page
JSON.get('/OpenForum/AddOn/Tagging/Get', null,
'pageName=/MyPage')
.onSuccess(function(tags) {
console.log('Tags:', tags);
}).go();
// Find pages by tag
JSON.get('/OpenForum/AddOn/Tagging/Find', null,
'tag=tutorial')
.onSuccess(function(pages) {
console.log('Pages with tag:', pages);
}).go();
// Get tag cloud
JSON.get('/OpenForum/AddOn/Tagging/Cloud')
.onSuccess(function(tagCloud) {
console.log('Tag cloud:', tagCloud);
}).go();
Tag Cloud Format
{tag: "tutorial", count: 15},
{tag: "javascript", count: 12},
{tag: "beginner", count: 8}
Configuration
- Tag storage location
- Maximum tags per page
- Tag naming conventions
- Tag search options
×
Quick Reference Open in a new tab
Update
Automatic update system for OpenForum pages and AddOns from parent servers
Key Features
- Check for available updates
- Download and install updates
- Version tracking
- Dependency management
- Automatic update capability
- Release notes display
- Update history tracking
- Parent server synchronization
Update Quick Reference
Automatic update system for OpenForum pages and AddOns from parent servers
Key Features
- Check for available updates
- Download and install updates
- Version tracking
- Dependency management
- Automatic update capability
- Release notes display
- Update history tracking
- Parent server synchronization
Server-Side Usage:
// Get the Update API
var Update = js.getObject("/OpenForum/AddOn/Update","Update.sjs");
// Check for updates
var updateInfo = Update.getUpdateInfo("/MyPage");
// Get update from parent server
Update.getUpdate("/MyPage");
// List available updates
var updates = Update.listAvailableUpdates();
// Install update
Update.installUpdate("/MyPage", "1.2.0");
// Check if update available
var isAvailable = Update.isUpdateAvailable("/MyPage");
Client-Side Usage:
// Get update info
JSON.get('/OpenForum/AddOn/Update/Info', null,
'pageName=/MyPage')
.onSuccess(function(info) {
console.log('Update info:', info);
console.log('Version:', info.version);
console.log('Release notes:', info.notes);
}).go();
// Download and install update
JSON.post('/OpenForum/AddOn/Update/Get', null,
'pageName=/MyPage')
.onSuccess(function(result) {
console.log('Update installed:', result);
}).go();
// List all available updates
JSON.get('/OpenForum/AddOn/Update/List')
.onSuccess(function(updates) {
console.log('Available updates:', updates);
}).go();
Update Info Format
{
pagename: "/MyPage",
version: "1.2.0",
releaseTime: "2025-01-15",
zipfilesize: 52341,
extra: {
notes: "Bug fixes and improvements",
requires:
{pageName: "/OpenForum/Core", version: "2.0"}
},
autoUpdate: true
}
Configuration
- Parent host URL
- Auto-update settings
- Update check frequency
- Dependency resolution
×
Quick Reference Open in a new tab
WorkQueue
Manage and process work items in sequential queues with SLA tracking
Key Features
- Create and manage multiple work queues
- Add items to queues
- Process items sequentially
- Track item status (pending, processing, completed, failed)
- SLA time monitoring
- Queue administration interface
- Item metadata and timestamps
- Queue statistics and monitoring
WorkQueue Quick Reference
Manage and process work items in sequential queues with SLA tracking
Key Features
- Create and manage multiple work queues
- Add items to queues
- Process items sequentially
- Track item status (pending, processing, completed, failed)
- SLA time monitoring
- Queue administration interface
- Item metadata and timestamps
- Queue statistics and monitoring
Server-Side Usage:
// Get the WorkQueue API
var WorkQueue = js.getObject("/OpenForum/AddOn/WorkQueue","WorkQueue.sjs");
// Create a queue
WorkQueue.createQueue("myQueue");
// Add item to queue
WorkQueue.addItem("myQueue", {
name: "task1",
data: {key: "value"},
slaTime: 3600000 // 1 hour in milliseconds
});
// Get next item from queue
var item = WorkQueue.getNextItem("myQueue");
// Update item status
WorkQueue.updateStatus("myQueue", "task1", "processing");
// Complete item
WorkQueue.completeItem("myQueue", "task1");
// Fail item
WorkQueue.failItem("myQueue", "task1", "Error message");
// Get queue statistics
var stats = WorkQueue.getQueueStats("myQueue");
// List all queues
var queues = WorkQueue.listQueues();
Client-Side Usage:
// Add item to queue
JSON.post('/OpenForum/AddOn/WorkQueue/Add', null,
'queueName=myQueue&itemName=task1&data=' JSON.stringify(itemData))
.onSuccess(function(result) {
console.log('Item added to queue');
}).go();
// Get next item
JSON.get('/OpenForum/AddOn/WorkQueue/Next', null,
'queueName=myQueue')
.onSuccess(function(item) {
console.log('Next item:', item);
}).go();
// Update item status
JSON.post('/OpenForum/AddOn/WorkQueue/UpdateStatus', null,
'queueName=myQueue&itemName=task1&status=processing')
.onSuccess(function(result) {
console.log('Status updated');
}).go();
// Get queue stats
JSON.get('/OpenForum/AddOn/WorkQueue/Stats', null,
'queueName=myQueue')
.onSuccess(function(stats) {
console.log('Queue count:', stats.count);
}).go();
Item Statuses
- pending - Item waiting to be processed
- processing - Item currently being processed
- completed - Item successfully processed
- failed - Item processing failed
Queue Item Format
{
name: "task1",
status: "pending",
sla_time: 3600000,
created: 1705334400000,
data: {
// Custom item data
}
}
Configuration
- Queue retention policy
- SLA warning thresholds
- Auto-retry failed items
- Queue processing workers
×
Quick Reference Open in a new tab