| Ocalt Query Language
Pricing Dashboard ocalt.com v1.0

Verb Index

Every verb, modifier, declaration, and system variable in OQL — source-canonical, grouped by category.

Tier limits

OQL API access is gated by the Ocalt account tier of the authenticating namespace.

TierQueries / dayConcurrent instancesStorage (total)/mounted/ storage
Free10014 GB
Starter10,00048 GB4 GB
Pro100,0001664 GB60 GB
Enterprise1,000,00064256 GB252 GB

A concurrent instance is one active /v1/query request in flight for the namespace. Exceeding the limit returns InstanceLimitExceeded. Exceeding the daily query count returns QuotaExceeded. Both reset at UTC midnight.

Modifiers

Modifiers appear after the verb operand. All are optional unless stated. String values accept double quotes, single quotes, or backticks interchangeably.

ModifierMeaning
AS "value"Mode, format, direction, or target type depending on verb
AT "position"Coordinate, timestamp, or position
ATTACH ?valSecondary value passed alongside the operand (verb-specific)
FORMAT "value"Sort direction ("desc"), date format, or unit
FROM nStart position, source database, or source currency
INTO "path"Output path, destination variable, or target array
LIMIT nMaximum row count
ON "value"TTL in seconds (CACHE/EXPIRE), cron expression (CRON), or event name (WATCH)
SORT BY "col"Database sort column
TO nEnd position, target length (PAD), or destination
USING "algo"Algorithm identifier for HASH, SIGN, VERIFY, FLIP, FILTER
WHERE conditionFilter condition — column expression for database, needle for string search verbs, pattern for MATCH/SEARCH
WITH "value"Body, pad character, delimiter, secret key, secondary input, or label

Chain operators

OperatorBehaviour
AFTERSequential — next step runs after current completes
ANDParallel — branches execute simultaneously on the thread pool; results collected as array or multivariable
ORFallback — runs only if the preceding step errored or returned null

Block delimiters

KeywordMeaning
OPEN NESTBegin a block body
CLOSE NESTEnd the innermost open block
CLOSE ALL NESTSEnd all open blocks at once

Binding

KeywordMeaning
SET ?nameBind result to ?name in scope; variable persists for the remainder of the query
UNSET ?nameRemove ?name from scope; subsequent reads of that variable return null

Output

VerbDescription
EMIT ?valReturns ?val as the query result. In a sequential chain the last EMIT wins. EMIT ?v AND EMIT "y" collects both into [v, "y"]. Inside an HTML block appends to HTML buffer instead. Inside an EMAIL block appends to email body. On a multivariable returns one random branch. → operand passthrough. Full EMIT docs →

Comparison operators (IF / WHERE / WHILE)

SingularPlural (SOME / WHILE SOME)
IS EQUAL TOARE EQUAL TO
IS IDENTICAL TOARE IDENTICAL TO
IS NOT EQUAL TOARE NOT EQUAL TO
IS GREATER THANARE GREATER THAN
IS LESS THANARE LESS THAN
IS GREATER THAN OR EQUAL TOARE GREATER THAN OR EQUAL TO
IS LESS THAN OR EQUAL TOARE LESS THAN OR EQUAL TO
IS NULLARE NULL
IS NOT NULLARE NOT NULL
CONTAINSCONTAIN
MATCHESMATCH

Control flow

StatementDescription
IF ?val IS EQUAL TO "x" OPEN NEST ... CLOSE NESTExecute block if condition passes. !STATE(IF) set to boolean result.
IF SOME ?arr IS EQUAL TO "x" OPEN NEST ... CLOSE NESTExecute block if any element satisfies the condition. !STATE(IF) set to match count.
ELSE IF ?val IS ... OPEN NEST ... CLOSE NESTChained condition; evaluated only when no preceding IF/ELSE IF executed.
ELSE OPEN NEST ... CLOSE NESTExecutes when no preceding IF or ELSE IF condition passed.
WHILE ?val IS ... OPEN NEST ... CLOSE NESTLoop until condition fails. !STATE(WHILE) set to boolean result each iteration. Hard limit: 1,000,000,000 iterations.
WHILE SOME ?arr IS ... OPEN NEST ... CLOSE NESTLoop while any element satisfies condition. !STATE(WHILE) set to match count.
FOREACH ?collection AS ?item OPEN NEST ... CLOSE NEST [SET ?results]Iterate over array elements. !INDEX = 0-based position, !VALUE = current item. Each iteration's last result collected into array; bound via SET if provided.
REPEAT n OPEN NEST ... CLOSE NEST [SET ?index]Execute block n times. 0-based iteration index bound via SET if provided.
SWITCH ?val OPEN NEST CASE "x" OPEN NEST ... CLOSE NEST DEFAULT OPEN NEST ... CLOSE NEST CLOSE NESTMatch ?val against each CASE value; first match executes. DEFAULT executes when no case matches.
RETURN ?valExit the current operation or block immediately, returning ?val as its result.
EXIT ALLTerminate the entire query graph immediately, including all enclosing blocks and operations.

Operations

Ephemeral operations are scope-local to the current query. Persistent operations are stored in AppState and survive across queries.

StatementDescription
NEW OPERATION AS "name" OPEN NEST ... CLOSE NESTDefine an ephemeral operation. Errors if "name" already exists in scope.
NEW PERSISTENT OPERATION AS "name" OPEN NEST ... CLOSE NESTDefine a stored operation that persists across queries. Errors if "name" already exists in store.
ALTER OPERATION "name" OPEN NEST ... CLOSE NESTRedefine an existing ephemeral or persistent operation. Errors if "name" does not exist.
EXECUTE "name" [SET ?result]Invoke a named operation. Searches scope-local first, then store.
EXECUTE OPERATION "name" [SET ?result]Alias for EXECUTE "name".
OPERATION LIST SET ?arr→ array of operation name strings from the store
OPERATION DESCRIBE "name" SET ?op→ operation name string or null if not found
OPERATION DELETE "name" SET ?okDelete a persistent operation from the store. → true

Error handling

StatementDescription
CATCH ERROR SET ?msgIntercepts the error message from the most recently failed step and binds it to ?msg. Returns null if no error pending. Execution continues on the next step.
CATCH ERROR RESETClears the pending error without binding it. Subsequent steps proceed normally.

CALCULATE / COLLAPSE

StatementDescription
CALCULATE "expr" SET ?resultEvaluate a math expression string. Reference OQL variables as ?name within the expression. Supports standard arithmetic, operator precedence, and functions: floor ceil sqrt abs pow min max round.
COLLAPSE ?multivariable SET ?arrMerge the results of AND-parallel branches into a single array. Pruned branches produce null entries.

NEW JSON OBJECT

SyntaxDescription
NEW JSON OBJECT OPEN NEST SET "key" AS ?val ... CLOSE NEST SET ?objConstruct a JSON object literal. Each SET "key" AS expr line inside the block adds one key–value pair. Keys are string literals. Values are any OQL expression. Returns completed object.

NEW ARRAY

VerbKey modifiers
NEW ARRAY OPEN NEST ENLIST ?val ... CLOSE NEST SET ?arrENLIST is only valid inside a NEW ARRAY block. Each ENLIST line appends one element to the array under construction.

String verbs

VerbKey modifiers
UPPER "text"
LOWER "text"
UCWORDS "text"Title-case all words
TRIM STRING "text" / TRIM "text"Strip leading and trailing whitespace
LENGTH "text"→ character count for text, element count for arrays, byte count for binary
REPLACE "text"WHERE "find" WITH "repl" — literal replacement. AS "regex" for regex mode. FROM n TO n WITH "repl" for positional substr_replace (0-based).
SPLIT "text"WITH "delim" — default delimiter ",". → array of strings
JOIN ?arrayWITH "delim" — default delimiter "". → string
PAD "text"TO n WITH "char" AS "left"|"right"|"both" — default direction "left"
SLICE "text"FROM n TO n — 0-based character positions (start inclusive, end exclusive). Also works on arrays.
SUBSTR "text"FROM n WITH length — extract substring by start position and character count. FROM is 0-based; WITH omitted means to end of string. Unlike SLICE, uses start+length not start+end.
CONTAINS "text"WHERE "needle" → boolean
STARTS "text"WHERE "prefix" → boolean
ENDS "text"WHERE "suffix" → boolean
INDEX "text"WHERE "needle" → 0-based byte position or null if not found
REPLICATE "text"WITH n — repeat string n times
CHARS "text"→ array of single-character strings
WORDS "text"→ array of whitespace-delimited words
MATCH "text"WHERE "pattern" — regex match. AS "all" returns all matches as array. Single match otherwise. Errors if no match found.
REVERSE "text"→ string reversed character by character. Also works on arrays (element order).
STRING ?valCoerce any value to its text representation

Compute verbs

VerbKey modifiers
CAST ?valAS "text"|"number"|"boolean"|"json"
UUID→ UUID v4 string
RANDOMFROM min TO max — random integer in [min, max] inclusive. FROM defaults to 0.
HASH "text"USING "SHA256"|"SHA1"|"MD5" — default "SHA256". SHA1 and MD5 are stub implementations returning a SHA256-derived prefix with a type marker; use SHA256 for production.
ENCRYPT "text"WITH "password" USING "AES-256" — AES-256-GCM; key derived via PBKDF2-HMAC-SHA256 (10 000 iterations, fixed salt). Output: base64(nonce||ciphertext).
DECRYPT "text"WITH "password" USING "AES-256" — decrypts ENCRYPT output. Errors on wrong password or corrupted data.
SIGN ?payloadUSING "JWT" WITH "secret" — HS256 JWT. Payload must be an object or array. → signed JWT string
VERIFY ?tokenUSING "JWT" WITH "secret" — validates HS256 signature. → decoded payload object or error on mismatch
COMPARE "plain"WITH "hash" — constant-time bcrypt comparison via accounts bridge. → boolean
ENCODE "text"AS "base64" — encodes text or binary to base64 string
DECODE "text"AS "base64" — decodes base64 string to binary
VALIDATE ?dataGATHER-style field validation — not yet implemented; always returns error
LOG ?valAS "info"|"warn"|"error" — writes [OQL LEVEL] value to server stdout. Default level "info". → true
TIMEAS "date"|"time"|"year"|"month"|"month-name"|"day"|"day-name"|"hour"|"minute"|"second"|"unix"|"weekday" — current server time. No AS → ISO-8601 "YYYY-MM-DDTHH:MM:SSZ". Operand overload: TIME ?ts AS "year" extracts part from a Unix timestamp or ISO-8601 string.

Array verbs

VerbKey modifiers
NEW ARRAY OPEN NEST ... CLOSE NESTENLIST ?val inside — append element at construction time
APPEND ?val INTO ?arrPush ?val to end of existing array. Null target creates a new single-element array.
APPEND ?val AS "key" INTO ?objSet or add key on existing object. AS can be a numeric index to insert at that position in an array. Null target creates a new object.
COLLAPSE ?multiMerge AND-parallel multivariable into a flat array
SORT ?arrWITH "field" for arrays of objects. FORMAT "desc" for descending.
REVERSE ?arrReverse element order. Also reverses a string.
UNIQUE ?arrRemove duplicate primitives (compared by display string)
FLATTEN ?arrRemove one level of nesting
FIRST ?arr→ first element or null
LAST ?arr→ last element or null
PLUCK ?arrWHERE "fieldname" — extract named field from each object in array. → array of field values
SLICE ?arrFROM n TO n — 0-based element positions. Also works on strings.
REMOVE "key" FROM ?arrRemove element at numeric index from array, or named key from object. Writes result back to ?arr. Array elements after the removed index shift down automatically.
REPACK ?arrRe-index numeric string keys on an object to 0..n-1 after removals. No-op on arrays (always contiguous). Useful after multiple REMOVE FROM operations on an object acting as a sparse array.

Parse & Transform verbs

VerbAccepted input / returns
PARSE JSON ?valJSON string → object or array
PARSE CSV ?valCSV string → array of row objects (first line = headers)
PARSE XML ?valXML string → {raw, type:"xml"} — structural parse deferred
PARSE YAML ?valYAML string → object or array
PARSE HTML ?valHTML string → {raw, type:"html"} — DOM parse deferred
PARSE MARKDOWN ?valMarkdown string → HTML string
PARSE TOML ?valTOML string → object
PARSE INI ?valINI string → nested object keyed by section; default section key "default"
PARSE RSS ?valRSS XML string → array of item objects: {title, link, description, pubDate, guid, author, category}
PARSE ATOM ?valAtom XML string → array of entry objects: {title, id, updated, summary, content, author, link}
PARSE PDF "/root/path"PDF file path → extracted text string
PARSE DOCX "/root/path"DOCX file path → extracted text string
PARSE XLSX "/root/path"XLSX file path → array of row arrays (each row is array of cell strings)
PARSE ODT "/root/path"ODT file path → extracted text string (same handler as DOCX)
PARSE BASE64 ?valBase64 string → binary
PARSE TEXT ?valPassthrough — returns operand as text string
EXTRACT ?valWHERE "selector" — regex on text, dotted key path on object, [*].field on array. AS "all" returns all matches as array.
CONVERT "/root/src"AS "format" INTO "/root/dst" — image→image (ImageMagick): jpg jpeg png gif webp tiff bmp ico svg avif heic heif. video→video (FFmpeg): mp4 mov avi mkv webm flv wmv m4v 3gp. video/audio→audio: mp3 wav ogg flac aac m4a. document (LibreOffice): pdf docx doc odt rtf txt xlsx csv pptx odp html. → virtual output path string

Archive verbs

File-based compression and extraction. All paths are virtual (/root/). Operand is a single path string or an array of paths.

VerbKey modifiers
COMPRESS ?pathsAS "zip"|"tar"|"tar.gz"|"tgz"|"tar.bz2"|"tbz2"|"gz" INTO "/root/out""gz" accepts exactly one source file. → virtual output path string
DECOMPRESS "/root/archive"INTO "/root/dir" — format auto-detected from file extension (.zip .tar .tar.gz .tgz .tar.bz2 .tbz2 .gz). → count of extracted files

Database verbs

The OQL database is an in-memory relational engine (DashMap hot layer + redb persistence). All filter expressions use OQL WHERE syntax, not SQL. Default database name is "main" if FROM is omitted.

VerbKey modifiers / Returns
CREATE DATABASE "name"Create a new database. → true
DATABASE LIST→ array of database name strings
DELETE DATABASE "name"Drop database and all its tables. → true
CREATE TABLE "tbl" IN "db"WITH COLUMN SET "col" AS TEXT|NUMBER|BOOLEAN|DATE|TIMESTAMP|UUID|ENCRYPTED|BLOB AND ... — define columns. AS FORMULA "expr" for computed columns.
TABLE LIST "db"→ array of {name, columns} objects
FLUSH TABLE "tbl" FROM "db"Delete all rows, keep table structure. → true
DELETE TABLE "tbl" IN "db"Drop table entirely. → true
INSERT "{"col":val}" INTO "tbl" FROM "db"Insert a row from a JSON string. → inserted row ID number
QUERY "tbl" FROM "db"WHERE "col IS EQUAL TO 'val'" SORT BY "col" FORMAT "desc" LIMIT n OFFSET n → array of row objects
UPDATE "tbl" FROM "db"WHERE "filter" WITH "{"col":"newval"}" → count of updated rows
PURGE "tbl" FROM "db"[WHERE "filter"] — no WHERE purges all rows. → count of deleted rows

Database — aggregates & analytics

VerbKey modifiers / Returns
COUNT "tbl" FROM "db"[WHERE "filter"] → row count as number
SUM "tbl" FROM "db"[WHERE "filter"] WITH "col" → sum of numeric column
AVG "tbl" FROM "db"[WHERE "filter"] WITH "col" → mean of numeric column
MIN "tbl" FROM "db"[WHERE "filter"] WITH "col" → minimum value of numeric column
MAX "tbl" FROM "db"[WHERE "filter"] WITH "col" → maximum value of numeric column
MEDIAN "tbl" FROM "db"[WHERE "filter"] WITH "col" → median of numeric column
MODE "tbl" FROM "db"[WHERE "filter"] WITH "col" → most frequent value of any column
STDEV "tbl" FROM "db"[WHERE "filter"] WITH "col" → population standard deviation of numeric column
GROUP "tbl" FROM "db" BY "col"[WHERE "filter"] [WITH "col" AS "sum|avg|min|max"] [HAVING "filter"] → array of {col, count, [op_col], rows} objects. HAVING filters on the group result.
RANK "tbl" FROM "db"[WHERE "filter"] WITH "col" [AS "desc"] → all rows sorted by column with a rank field (1-based) added to each

Database — WHERE filter syntax

Used in WHERE, HAVING, and UPDATE WHERE. Combine with AND / OR.

ExpressionMeaning
col IS EQUAL TO 'val'Exact match (string or number)
col IS NOT EQUAL TO 'val'Inequality
col IS GREATER THAN nNumeric comparison
col IS LESS THAN nNumeric comparison
col IS GREATER THAN OR EQUAL TO n
col IS LESS THAN OR EQUAL TO n
col IS BETWEEN n AND mInclusive range
col IS IN 'a,b,c'Membership — comma-separated values
col IS NOT IN 'a,b,c'Non-membership
col IS LIKE 'pat%'SQL-style wildcard — % any sequence, _ any single char. Case-insensitive.
col IS NOT LIKE 'pat%'Inverse wildcard match
col IS SIMILAR TO 'pat' AS PREFIXStarts-with match
col IS SIMILAR TO 'pat' AS SUFFIXEnds-with match
col IS SIMILAR TO 'pat' AS WHOLEExact whole-string match
col CONTAINS 'val'Substring present in text, or element present in array
col IS NULLField is null or absent
col IS NOT NULLField has a non-null value

Filesystem verbs

Every namespace has two virtual filesystem roots. /root/ is the primary sandbox — always available, capped at 4 GB on every tier. /mounted/ is the extended storage volume — available on Starter and above (tier total minus 4 GB); absent on Free tier. Any path not starting with /root/ or /mounted/, or that escapes via .., is rejected.

VerbKey modifiers
WRITE "content"INTO "/root/path" or INTO "/mounted/path" — creates parent directories. AS "append" to append. → virtual path string
READ "/root/path"AS "json" to auto-parse JSON content. Works on /mounted/ too. → text, binary, or parsed object
LIST "/root/"AS "recursive" for full subtree. WHERE "*.ext" to filter. Works on /mounted/ too. → array of virtual path strings
STAT "/root/path"{path, is_file, is_dir, size}
EXISTS "/root/path"→ boolean
MKDIR "/root/dir"Creates directory and all parents. Works on /mounted/ too. → virtual path string
COPY "/root/a"TO "/root/b"AS "recursive" for directories. Cross-volume copy supported. → destination path
MOVE "/root/a"TO "/root/b" — cross-volume move supported. → destination path
REMOVE "/root/path"AS "recursive" for non-empty directories. → true
CLEAR "/root/dir"Delete all contents of directory; keep the directory itself. → count of deleted entries
SEARCH "/root/"WHERE "glob"AS "recursive". Glob patterns: "*" all, "*.ext" by extension, "prefix*" by prefix, exact name. Works on /mounted/ too. → array of virtual path strings
FILE SELECT "path"AND-chain multiple paths to build an array for COMPRESS or other multi-file verbs. Paths may mix /root/ and /mounted/. → array of virtual path strings
FILE STORAGE SIZE→ total namespace disk usage in bytes (both /root/ and /mounted/ combined) as a number
SHARE "/root/path"AS "24h"|"7d"|"30d"|"never" — default: no TTL. Creates public share link. Free tier: 1 active share (auto-replaces previous). Starter: 64. Pro: 128. Enterprise: 1024. Works on /mounted/ too. → https://ocalt.com/files/{token} URL
UNSHARE "/root/path"Revoke all share tokens for a specific path. → count revoked
FILE SHARE LIST→ array of {url, path, expires_at} objects for all active shares in the namespace
FILE UNSHARE ALLRevoke all active shares for the namespace. → true
SERVE "/root/file"Read file and return as binary response body. API router sets Content-Type from extension.
ENV "VAR_NAME"Read a server-side environment variable. → text string or null

Auth verbs

VerbKey modifiers / Returns
REGISTER "username"WITH "password" [AS "email"] → UID number or error
LOGIN "username"WITH "password"{token, user_id} object or error
LOGOUT ?tokenInvalidate a single session. → boolean
SESSION ?token{user_id, username, email} object or null (expired / not found)
REFRESH ?tokenExtend session expiry by 30 days. → same token string or error
REVOKE ?user_idRevoke all sessions for a user by numeric user_id. → count of sessions revoked
COMPARE "plain"WITH "hash" — constant-time bcrypt comparison. → boolean

Cache verbs

VerbDescription
CACHE "value" AS "key"Store value under key with no TTL
CACHE "value" AS "key" ON "seconds"Store with TTL (integer seconds as string)
CACHE "key" SET ?varRetrieve by key. → value or null if missing/expired
FLUSH "key"Delete a cache key. → boolean
EXPIRE "key" ON "seconds"Reset TTL on existing key. → true or null if key not found

Network verbs

VerbKey modifiers
FETCH "url" / GET "url"HTTP GET. JSON responses auto-parsed. Non-2xx → {ok:false, status, body}.
POST "url"WITH ?body — object/array sent as JSON; text as plain; binary as octet-stream
PUT "url"WITH ?body
DELETE "url"
PING "url"Performs a GET request. → {alive:boolean, url:string} — alive is true if the GET succeeded
RESOLVE "hostname"DNS lookup. → array of IP address strings
DOWNLOAD "url"INTO "/root/path" — saves response body to file
UPLOAD "/root/file"TO "url" — POSTs file binary
CONNECT "url"HTTP GET with 30 s timeout — designed for SSE and long-poll endpoints. Returns response body (text or parsed JSON). Not a raw TCP connection.

HTTP control verbs

Modify the HTTP response when OQL runs in Site Mode. Return null and do not terminate the chain.

VerbKey modifiers
HEADER "name"AS "value" — append a response header
STATUS nSet HTTP response status code
REDIRECT "url"AS "301"|"302" — default 302. Sets Location header and status code.
COOKIE "name"AS "value" [WITH "path"] [FORMAT "expires"] — sets Set-Cookie header with Secure; SameSite=Lax
COOKIE DELETE "name"Sets cookie expiry to 1 Jan 1970 — removes it from the browser
GOTO "url"Sets 302 Location header and returns the URL string.

Streaming verbs

VerbKey modifiers
STREAM ?valTO "channel" [FROM "namespace"] — emit event to named channel via oql-signal. → delivered count
BROADCAST ?val[FROM "namespace"] — emit to all connected clients in namespace. → delivered count
SUBSCRIBE "channel"[FROM "namespace"] — block up to 30 s for next event on channel. → event data or null on timeout
PUBLISH ?valTO "channel" — alias for STREAM

Image verbs

Image verbs operate on an in-memory canvas value (binary) produced by IMAGE LOAD or RAW IMAGE CREATE. Chain operations without writing to disk until RENDER or WRITE.

VerbKey modifiers
IMAGE LOAD "/root/path"Decode image file (jpg png gif webp tiff bmp and others) into canvas binary value.
RESIZE ?imgTO "WxH" — bilinear resampling. Width and height in pixels.
CROP ?imgFROM "x1xY1" TO "x2xY2" — pixel rectangle; top-left origin
ROTATE ?imgAT "90"|"180"|"270" — degrees clockwise
FLIP ?imgUSING "horizontal"|"vertical"
FILTER ?imgUSING "grayscale"|"invert"|"brighten"|"contrast"|"sepia"|"blur"|"sharpen" [WITH n]n is intensity or pass count
THUMBNAIL ?imgAT "WxH" — fit-within, preserving aspect ratio
WATERMARK ?imgWITH "/root/wm.png" AT "top-left"|"top-right"|"bottom-left"|"bottom-right"|"center" — alpha-blend watermark PNG onto canvas
COMPOSITE ?imgWITH "/root/overlay.png" — alpha-blend overlay at top-left origin
HISTOGRAM ?img{r:[0..255 counts], g:[...], b:[...]}
DRAW TEXT "text"FROM ?img AT "XxY" USING "white"|"black"|"#rrggbb" — render text at pixel position using built-in 5×7 bitmap font. → modified canvas
RENDER ?imgAS "PNG"|"BMP" — encode canvas to binary bytes. Default "PNG". Chain with WRITE to save.

Audio / Video verbs

All paths are virtual (/root/). Each write verb requires INTO "/root/dst". Operations invoke FFmpeg or ffprobe as subprocesses.

VerbKey modifiers
TRANSCODE "/root/src"AS "format" INTO "/root/dst" — remux/re-encode to target container
TRIM VIDEO "/root/src"FROM "HH:MM:SS" TO "HH:MM:SS" INTO "/root/dst"
TRIM AUDIO "/root/src"FROM "HH:MM:SS" TO "HH:MM:SS" INTO "/root/dst"
SPLICE "/root/a"WITH "/root/b" INTO "/root/dst" — concatenate two files via stream copy
CONCAT "/root/a"WITH "/root/b" INTO "/root/dst" — concatenate two files via stream copy
INSERT FRAME "/root/img"INTO "/root/vid" AT "HH:MM:SS" FROM duration_secs TO "/root/dst" — hold image as still clip at timestamp
INSERT CLIP "/root/clip"INTO "/root/vid" AT "HH:MM:SS" FROM duration_secs TO "/root/dst" [USING "loop"]
EXTRACT FRAME "/root/vid"AT "HH:MM:SS" INTO "/root/img.png" — extract single frame as image file
EXTRACT AUDIO "/root/vid"INTO "/root/audio.mp3" — strip audio track as MP3
OVERLAY "/root/vid"WITH "/root/asset" AT "x:y" INTO "/root/dst" — overlay image or video at coordinate
SUBTITLE "/root/vid"WITH "/root/sub.srt" INTO "/root/dst" — burn subtitles into video
REPLACE AUDIO "/root/vid"WITH "/root/audio" INTO "/root/dst" — swap entire audio track
REPLACE FRAME "/root/vid"WITH "/root/img" FROM "HH:MM:SS" TO "HH:MM:SS" INTO "/root/dst" — replace time range with a still image
REPLACE CLIP "/root/vid"WITH "/root/clip" FROM "HH:MM:SS" TO "HH:MM:SS" INTO "/root/dst"
SPEED VIDEO "/root/vid"WITH "2.0" INTO "/root/dst" — speed multiplier; audio tempo adjusted accordingly
REVERSE VIDEO "/root/vid"INTO "/root/dst" — reverses video and audio simultaneously
MUTE VIDEO "/root/vid"INTO "/root/dst" — removes audio track
LOOP VIDEO "/root/vid"WITH n INTO "/root/dst" — loop video n times total (default 2)
SET VOLUME "/root/vid"WITH "1.5" INTO "/root/dst" — volume multiplier
NORMALIZE AUDIO "/root/vid"INTO "/root/dst" — loudnorm filter
PITCH AUDIO "/root/vid"WITH "1.2" INTO "/root/dst" — pitch multiplier via asetrate+aresample
MIX AUDIO "/root/a"WITH "/root/b" INTO "/root/dst" — blend two audio streams (amix)
FADE VIDEO "/root/vid"AS "in"|"out" WITH "dur_secs" FROM "start_secs" INTO "/root/dst" — video and audio fade simultaneously
FADE AUDIO "/root/vid"AS "in"|"out" WITH "dur_secs" FROM "start_secs" INTO "/root/dst"
SCALE VIDEO "/root/vid"WITH "1920x1080" INTO "/root/dst"WITH "width" auto-computes height
STABILIZE VIDEO "/root/vid"INTO "/root/dst" — two-pass vidstab (detect + transform)
TEXT ON VIDEO "/root/vid"WITH "text" AT "x:y" FROM "fontsize" AS "color" [USING "/root/font.ttf"] INTO "/root/dst" — drawtext filter with box background
PROBE MEDIA "/root/vid"→ ffprobe JSON object: {streams, format}
COLOR GRADE "/root/vid"WITH "contrast=1.2:saturation=1.3:brightness=0.1:gamma=1.0" INTO "/root/dst" — FFmpeg eq filter parameters
BLUR VIDEO "/root/vid"WITH "radius" INTO "/root/dst" — box blur; default radius 5
MIRROR VIDEO "/root/vid"AS "horizontal"|"vertical" INTO "/root/dst"
FREEZE FRAME "/root/vid"AT "HH:MM:SS" WITH "duration_secs" INTO "/root/dst" — insert still hold at timestamp
GREEN SCREEN "/root/vid"WITH "/root/bg" AS "0x00FF00" FROM "similarity" TO "blend" INTO "/root/dst" — chromakey composite
SPLIT SCREEN "/root/a"WITH "/root/b" AS "horizontal"|"vertical" INTO "/root/dst" — hstack or vstack
BOOMERANG VIDEO "/root/vid"INTO "/root/dst" — forward then reversed concatenated
TRANSITION VIDEO "/root/a"WITH "/root/b" FROM "crossfade_secs" INTO "/root/dst" — xfade + acrossfade

Map verbs

Geocoding and reverse-geocoding use OpenStreetMap Nominatim (no API key required). Routing uses the OSRM public demo server. Each Nominatim request uses a randomised IP identity — no global rate limiting, no request queuing. Response time is network latency only (typically 500ms–1s).

VerbKey modifiers / Returns
MAP SEARCH "query"→ array of {name, lat, lon, type, osm_id, street_number, street, suburb, city, province, postcode, country, country_code, address}
MAP GEOCODE "address"{lat, lon, name} — coordinates for first result
MAP REVERSE "lat,lon"{display_name, name, lat, lon, address}. Also: MAP REVERSE lat BY lon
MAP PIN "lat,lon"WITH "label"{lat, lon, name}
MAP DISTANCE "lat1,lon1"TO "lat2,lon2" → distance in kilometres (Haversine)
MAP BOUNDS ?placesArray of {lat,lon} objects → {min_lat, max_lat, min_lon, max_lon, center_lat, center_lon}
MAP CLUSTER ?placesWITH "radius_km" → array of {center_lat, center_lon, count, points}
MAP ROUTE "from"TO "to" — geocodes both endpoints then routes via OSRM driving. → {distance_km, duration_min, from, to, from_lat, from_lon, to_lat, to_lon}
MAP RENDER ?places[FORMAT "street"|"satellite"|"terrain"] [WITH zoom] — places = array of {lat,lon,name}. → temporary URL to a Leaflet HTML map page

Calendar verbs

Built-in per-namespace calendar. All verbs are prefixed with CALENDAR. Datetimes are UTC Unix timestamps. Accepted datetime input: "2026-07-01T09:00:00" or "2026-07-01".

VerbKey modifiers / Returns
CALENDAR CREATE EVENT "title"AT "start" TO "end" USING "tz" FORMAT "desc" WITH "attendees" AS "freq" ON "day" FROM "cal-id" → event object
CALENDAR GET EVENT "id"→ event object
CALENDAR GET EVENTS "today"|"this week"|"this month"→ array of event objects
CALENDAR GET EVENTS FROM "date" TO "date"[WHERE "filter"] → array of event objects
CALENDAR GET NEXT EVENT→ next upcoming event object or null
CALENDAR UPDATE EVENT "id"WITH "title" FORMAT "desc" AT "start" TO "end" USING "tz" → true
CALENDAR DELETE EVENT "id"AS "this"|"following"|"all" — default: this occurrence. → count
CALENDAR CREATE CALENDAR "name"FORMAT "desc" WITH "#hex" → calendar object
CALENDAR LIST→ array of calendar objects
CALENDAR DELETE CALENDAR "id"→ count deleted
CALENDAR CHECK AVAILABILITY FROM "date" TO "date"WITH "30m" → array of {start_ts, end_ts} free slots
CALENDAR BOOK SLOT ?slotWITH "Name" FORMAT "email" → event object
CALENDAR COUNT FROM "date" TO "date"→ count of events in range
CALENDAR EXPORT "cal-id"→ iCal string (RFC 5545). Empty = all calendars.
CALENDAR IMPORT "/root/file.ics"→ count of imported events

Editor verbs

Document editor model. The document is a plain OQL object — open a file into a variable, manipulate with editor verbs, save back. Line and column numbers are 1-based. All verbs return the updated document object except EDITOR READ and EDITOR FIND.

VerbKey modifiers / Returns
EDITOR TEXT OPEN "path"Open or create a plain text file → document object
EDITOR CODE OPEN "path"Open or create a code file, auto-detect language → document object
EDITOR READ ?doc→ full content as string
EDITOR SAVE ?docINTO "/root/path" — saves to original or specified path → document object
EDITOR INSERT AFTER ?docWITH "content" AT "line" → document object
EDITOR INSERT BEFORE ?docWITH "content" AT "line" → document object
EDITOR REPLACE LINE ?docAT "line" WITH "content" → document object
EDITOR REPLACE RANGE ?docFROM "line" TO "line" AT "col" USING "col" WITH "content" → document object
EDITOR ERASE ?docAT "line" → document object
EDITOR GOTO ?docAT "line" USING "col" — move cursor → document object
EDITOR SELECT ?docFROM "line" TO "line" AT "col" USING "col" → document object
EDITOR FIND ?docWITH "pattern" — case-insensitive → array of {line, col, text}
EDITOR COPY ?docCopy selection or cursor line to clipboard[0] → document object
EDITOR CUT ?docCopy and remove selection or cursor line → document object
EDITOR PASTE ?docAT "line" — insert clipboard[0] after line → document object
EDITOR CLIPBOARD LIST ?doc→ array of clipboard strings (max 50)

Browser verbs

Headless Chromium via CDP (chromiumoxide). One browser instance per namespace; launched on first use, reused thereafter.

VerbKey modifiers
BROWSER OPEN "url"[WITH "user-agent"] — launch browser if not running, navigate, wait for navigation. → true
BROWSER NAVIGATE "url"Navigate without waiting for load. → true
BROWSER CLICK "selector"CSS selector. Errors if element not found. → true
BROWSER TYPE "selector"WITH "text" — click element then type text. → true
BROWSER READ "selector"→ inner HTML of element. Omit selector to read body.
BROWSER EVALUATE "js"Execute JavaScript in page context. → string, number, or boolean result
BROWSER SCREENSHOT "/root/out.png"Save full-page PNG screenshot. → file path string
BROWSER SCROLL "x,y"Call window.scrollBy(x, y). → true
BROWSER WAIT nSleep for n seconds. → true
BROWSER BACKhistory.back(). → true
BROWSER FORWARDhistory.forward(). → true
BROWSER RELOADReload the current page. → true
BROWSER COOKIES→ array of {name, value, domain} objects
BROWSER TAB NEXTDispatch Tab keydown event on focused element. → true
BROWSER TAB PREVDispatch Shift+Tab keydown event on focused element. → true
BROWSER FOCUS CHECK[AS "id"|"name"|"class"] → attribute value of currently focused element. Default attribute: "id".
BROWSER CLOSETerminate browser process for this namespace. → true

IMAP / Mail verbs

Requires an active session established by the IMAP connect verb. SMTP sending derives host from IMAP host by replacing imap. with smtp..

VerbKey modifiers / Returns
IMAP "imap.host.com"WITH "password" AS "user@host.com" — establish TLS session (default port 993). → true or error
MAIL INBOX→ array of up to 20 most recent messages: {uid, subject, from, to, date, body}
MAIL UNREAD→ array of unseen message objects
MAIL SEARCH "criteria"IMAP SEARCH criteria string (e.g. "FROM boss@co.com") → array of message objects
MAIL "uid"Fetch full message by UID → single message object including body
MAIL SENDTO "address" WITH "subject" AS "body" — SMTP STARTTLS. → true or error
MAIL CLOSEClear stored IMAP session for this namespace. → true

Notification verbs

VerbKey modifiers / Returns
EMAIL "body"TO "address" WITH "subject" — sends via accounts bridge. HTML body auto-detected by leading <. → true or error
NOTIFY "body"TO "userid" WITH "title" — Web Push via VAPID. → count of subscriptions delivered to
WEBHOOK ?dataAT "url" — HTTP POST of operand as JSON. → response
SMS "body"SMS provider not configured — always returns error

Push subscription verbs

VerbKey modifiers
PUSH SUBSCRIBE ?subscription_json AS "key"Store a browser Web Push subscription object under "key" for this namespace. → true
PUSH UNSUBSCRIBE "key"Remove stored push subscription by key. → true

OCR

VerbKey modifiers
OCR "/root/image.png"[AS "lang"] — Tesseract OCR. Default language "eng". Accepts /root/ paths or https:// URLs (downloaded to temp file). → extracted text string

DNS

VerbKey modifiers
DNS "domain"[AS "A"|"AAAA"|"MX"|"TXT"|"CNAME"|"NS"|"SOA"|"ALL"] — default "A". Uses system dig. → array of {name, ttl, type, value} objects

EXEC

VerbKey modifiers
EXEC "command arg1 arg2"Run a shell command via the system shell. → {exit_code, stdout, stderr, success}

WebRTC verbs

Signaling via oql-signal at 127.0.0.1:3002. Media is peer-to-peer and never touches the server. TURN/STUN hosted on the OQL server.

VerbKey modifiers / Returns
RTC CREDENTIALS[AS "ttl_seconds"] — HMAC-SHA1 time-limited TURN credentials. Default TTL 3600 s. → {ice_servers:[{urls, username, credential}], ttl}
RTC OFFER ?sdpAT "room" — signal offer SDP to room. → true
RTC ANSWER ?sdpAT "room" — signal answer SDP to room. → true
RTC ICE ?candidateAT "room" — signal ICE candidate to room. → true
RTC JOIN "room"→ array of peer strings currently in room
RTC LEAVE "room"→ true

GeoIP

MaxMind GeoLite2-City database. Client IP derived from the incoming request context in Site Mode.

OperandReturns
EMIT GEOIP ADDRESSClient IP address string
EMIT GEOIP CITYCity name string
EMIT GEOIP COUNTRYCountry name string
EMIT GEOIP REGIONState/province name string
EMIT GEOIP LATLatitude number
EMIT GEOIP LONLongitude number
EMIT GEOIP ALL{ip, city, country, region, lat, lon} object for client IP
EMIT GEOIP "1.2.3.4"{ip, city, country, region, lat, lon} object for the specified IP address

Weather & Currency

VerbKey modifiers / Returns
WEATHER "location"[FORMAT "metric"|"imperial"] — wttr.in backend. → {location, description, temp_c, temp_f, feels_like_c, feels_like_f, humidity, wind_kph, wind_mph, precip_mm, cloud_cover, visibility_km, uv_index, unit}
CURRENCY FROM "USD" TO "ZAR"Frankfurter API. Single target → {from, to, rate, date}. Multiple targets comma-separated in TO ("ZAR,EUR,GBP") → array of rate objects.

Delay & Schedule

VerbKey modifiers
DELAY "5s"Pause execution. Accepts: "Nms" milliseconds, "Ns" seconds, "Nm" minutes, "Nh" hours, "Nd" days, or bare integer seconds.
SCHEDULE AT "timestamp"Pause until Unix timestamp or ISO-8601 datetime string. No-op if timestamp is in the past.

CRON

StatementDescription
DEFINE CRON "name" ON "expression" OPEN NEST ... CLOSE NESTRegister a persistent cron job. Expression: standard 5-field cron ("*/5 * * * *"). Body executes on schedule in background. Replaces an existing job with the same name.
CRON LIST SET ?arr→ array of {name, expression, status, next_run, last_run}
CRON DESCRIBE "name" SET ?job→ single job object or null
CRON DELETE "name"→ true

WATCH

StatementDescription
WATCH "source" [ON "event"] [AS "name"] OPEN NEST ... CLOSE NEST [SET ?id]Register an event handler. Source formats: "fs:/root/uploads" (filesystem), "weather:London", "currency:USD/ZAR". Events: "create"|"modify"|"delete"|"change". Handler body runs in background on trigger. !EVENT(key) accesses event data inside the body. → handler name string
LIST WATCHES SET ?arr→ array of {name, source, event} objects
DELETE WATCH "name"→ boolean — true if found and removed

GATHER

Suspends query execution, renders an HTML form to the client, and resumes after submission. Field values are bound to OQL variables and available to subsequent steps.

ComponentDescription
GATHER [WITH "title"] [CLASS "css-class"] OPEN NEST ... CLOSE NESTOuter block. WITH sets form heading. CLASS overrides default .oql-gather CSS class.
?var TEXT [WITH "label"] [PLACEHOLDER "text"]Text input
?var NUMBERNumber input
?var BOOLEANCheckbox
?var DATEDate picker
?var TIMESTAMPDatetime-local picker
?var BLOBFile upload
?var TEXTAREAMulti-line textarea
?var RANGESlider with live value display
?var COLORColor picker
?var HIDDEN [PLACEHOLDER "preset"]Hidden field with preset value
?var SELECT OPTIONS "a" AND "b" AND "c"Dropdown select
?var RADIO OPTIONS "a" AND "b" AND "c"Radio button group
FORMAT EMAIL|PHONE|URL|DATE|TIME|DATETIMEInput type override + browser validation
FORMAT MINIMUM n TO MAXIMUM nmin/max for NUMBER and RANGE
FORMAT LENGTH MINIMUM n TO MAXIMUM nminlength/maxlength for TEXT and TEXTAREA
FORMAT REGEX "pattern"HTML pattern attribute
FORMAT REQUIREDRequired marker and validation
TO TABLE "name" WITH COLUMN "col" SET ?var AND ...Auto-insert submitted values into a database table after resume
Browser inputs: LOCATION CAMERA MICROPHONE FILE DEVICERequest browser API data (geolocation, camera, microphone, file picker, device info)

CONFIRM

StatementDescription
CONFIRM "message" AFTER ... OR ...Suspends execution and renders a Confirm/Cancel UI to the client. The AFTER chain executes on approval; the OR chain executes on rejection. Stored in AppState with 24 h timeout. Typical pattern: CONFIRM "Are you sure?" AFTER do_thing SET ?result OR EMIT "Cancelled"

WEBASSEMBLY / ENTER / GRANT

StatementDescription
GRANT WEBASSEMBLY ?var AS "alias"Expose OQL variable ?var inside the next WEBASSEMBLY block as oql_get("alias"). Grants are cleared after the WEBASSEMBLY block executes and its SET binding is applied.
WEBASSEMBLY AS "js" OPEN NEST ... CLOSE NEST SET ?resultExecute JavaScript in a bubblewrap-isolated Node.js sandbox. A return statement sets the result. Access granted OQL vars via oql_get("alias").
WEBASSEMBLY AS "python" OPEN NEST ... CLOSE NEST SET ?resultExecute Python 3 in a bubblewrap-isolated sandbox. stdout at process exit becomes the result string.
WEBASSEMBLY AS "wasm" OPEN NEST ... CLOSE NEST SET ?resultExecute a compiled WASM binary at the path given inside the block via wasmtime with WASI filesystem access scoped to /root/.
ENTER "expression" SET ?varSub-statement inside a WEBASSEMBLY block. Evaluates a named expression or function call from the block code and binds the result to ?var. Multiple ENTER lines supported.

INCLUDE / SIDELOAD

StatementDescription
INCLUDE "/root/file.oql" [SET ?result]Load and execute OQL code from a namespace filesystem file. Shares current scope.
INCLUDE "https://url" [SET ?result]Fetch OQL code from a URL and execute it. Shares current scope.
SIDELOAD ?code_string [SET ?result]Parse and execute an OQL code string from a variable. Shares current scope. Useful for dynamic query construction.

RAW IMAGE

Pixel-level image construction. Coordinate system: 1-based column BY row, top-left origin. All unspecified channels default to 0.

StatementDescription
RAW IMAGE CREATE w BY h OPEN NEST PIXEL x BY y IS RED n AND GREEN n AND BLUE n AND OPACITY n% ... CLOSE NEST SET ?imgConstruct a canvas pixel by pixel. Each PIXEL statement sets one pixel. Channel values 0–255; OPACITY accepts 0–100% (converted to 0–255 alpha). Returns binary canvas value.
RENDER ?img AS "PNG"|"BMP"Encode canvas binary to PNG or BMP bytes. Default "PNG". Chain with WRITE to save to file.

DOC CREATE

StatementDescription
DOC CREATE FROM "url" AS "pdf"|"docx" SET ?pathFetch URL content and convert to PDF or DOCX via LibreOffice. → virtual path under /root/files/
DOC CREATE FROM "html string" AS "pdf"|"docx" SET ?pathConvert an HTML string directly. → virtual path under /root/files/

HTML block

SyntaxDescription
HTML "tag" [CLASS "a" AND CLASS "b"] [ID "id"] [ATTR "name" VALUE "val"] OPEN NEST ... CLOSE NEST [SET ?html]Build an HTML element tree. EMIT inside the block appends to the element body. Multiple CLASS declarations are joined with a space. Returns completed HTML string.

Email block

SyntaxDescription
EMAIL TO "address" WITH "subject" OPEN NEST ... CLOSE NEST [SET ?ok]Render email body from block content. EMIT inside the block appends to the body buffer. HTML auto-detected from leading <. Sends via accounts bridge on CLOSE NEST. → true or error

USER DEVICE

StatementDescription
USER DEVICE [LOCATION] [CAMERA] SET ?dataSuspends execution, injects JavaScript to collect device info, resumes when data is posted back. ?data{width, height, platform, language, online, user_agent, lat, lon, accuracy, camera_available, touch_enabled, pixel_ratio, timezone}. LOCATION requests geolocation permission; CAMERA checks camera device availability. Timeout: 300 s.

REMEMBER / RECALL / FORGET / LIST REFS

Persistent cross-query key–value store scoped to the namespace, backed by SQLite. Values survive query restarts and deployments.

VerbKey modifiers / Returns
REMEMBER ?val AS "name"Store value persistently under "name". Overwrites if exists. → value (passthrough)
RECALL "name"→ stored value string or null
FORGET "name"Delete stored value. → true
LIST REFS→ array of {name, value} objects ordered by name

Domain verbs

VerbKey modifiers / Returns
DOMAIN LIST→ array of {subdomain, url, is_default} objects for this namespace
DOMAIN SEARCH "prefix"Minimum 5 characters. → array of {subdomain, url, available} objects
DOMAIN ADD "subdomain"Add extra subdomain. Tier limits: Starter 2, Pro 7, Enterprise 20. Free cannot add. → https://subdomain.ocalt.site URL or error
DOMAIN REMOVE "subdomain"→ true or error

Audio / Video bridge

Server-managed WebRTC room allocation. Media is peer-to-peer; the server only coordinates signaling slots. Peer count limit varies by tier.

StatementDescription
NEW AUDIO BRIDGE n PEERS SET ?roomAllocate an audio-only WebRTC room with n peer slots. → {room_id, type:"audio", expires, peers:[{slot, join_url}]}
NEW VIDEO BRIDGE n PEERS SET ?roomAllocate a video+audio WebRTC room. Same return shape. Peer limit by tier: Free 2, Starter 1, Pro 10, Enterprise unlimited.

System variables

VariableDescription
!NOWUnix timestamp (seconds) at query start — fixed for the entire query duration
!INDEX0-based iteration index inside FOREACH
!VALUECurrent item inside FOREACH
!STATE(IF)Boolean result of last IF condition; match count when used with IF SOME
!STATE(WHILE)Boolean result of last WHILE condition; match count with WHILE SOME
!STATE(FOREACH)FOREACH iteration count (same as !INDEX + 1)
!REQUEST(path)URL path (Site Mode)
!REQUEST(method)HTTP method (Site Mode)
!REQUEST(body)Raw request body (Site Mode)
!REQUEST(param:name)Query string parameter (Site Mode)
!REQUEST(form:field)Form POST field (Site Mode)
!REQUEST(header:name)Request header value (Site Mode)
!GET(name)Alias: !REQUEST(param:name)
!POST(field)Alias: !REQUEST(form:field)
!COOKIE(name)Cookie value (Site Mode)
!EVENT(key)Event data field inside a WATCH handler body

ONBROWSER [pending]

Browser-side OQL execution context. Runs inside a compiled WASM OQL runtime in the user's browser. Standard non-I/O verbs are legal inside. See ONBROWSER docs →

VerbDescription
ONBROWSER SELECT "css" SET ?elquerySelector — first match
ONBROWSER ALL SELECT "css" SET ?elsquerySelectorAll — all matches
ONBROWSER ?el INNERHTML "html"Set innerHTML on element
ONBROWSER ?el INNERTEXT "text"Set innerText on element
ONBROWSER ?el CLASS ADD|REMOVE|RESET "cls"classList manipulation
ONBROWSER ?el ATTRIBUTE ADD|REMOVE|UPDATE "attr" [WITH "val"]Attribute manipulation
ONBROWSER ?el STYLE "cssText"Merge full cssText string
ONBROWSER ?el STYLE PROPERTY "val"Set individual CSS property
ONBROWSER !window("prop") SET ?varRead window property
ONBROWSER !window("prop") AS "val"Set window property
ONBROWSER NAVIGATE "url"Navigate browser
ONBROWSER HASH "hash"Set location.hash
ONBROWSER RELOADReload page
ONBROWSER NEW OPERATION AS "name" OPEN NEST ... CLOSE NESTDefine client-side operation
ONBROWSER EXECUTE "name"Execute client-side operation
ONBROWSER ?el ONCLICK|ONCHANGE|ONSUBMIT EXECUTE "name" WITH !this AND !eventBind operation to DOM event

UX Components [pending]

Pre-composed styled HTML UI components. See UX docs →

VerbDescription
UX STYLESHEET SET ?cssReturns stylesheet link tag. Auto-injected on first use.
UX HEADER WITH ... SET ?htmlSite header with logo, title, username
UX HERO WITH ... SET ?htmlHero banner with headline, body, CTA
UX FOOTER WITH "copy" AS "copy" SET ?htmlSite footer
UX PANEL WITH ... SET ?htmlNavigation panel
UX FEED WITH ?items AS "items" SET ?htmlContent feed
UX POST TILE ?item AS "card"|"compact"|"feature" SET ?htmlSingle post tile
UX ANIMATE ?el AS "fade-in"|"slide-up"|"pulse"|"spin" SET ?htmlCSS animation wrapper

GRAPH [pending]

SVG chart generation from data. Output is a pure <svg> element. See GRAPH docs →

VerbDescription
GRAPH TYPE "type" WITH ?data [TITLE "t"] [FORMAT w BY h] [THEME "t"] [WHERE X IS "x" AND Y IS "y"] SET ?svgGenerate SVG chart. All modifiers optional. Inline key/value WITH for simple types. → SVG string

PRESENTATION [pending]

Build PPTX files from verbs. See PRESENTATION docs →

VerbDescription
PRESENTATION INTO "/root/deck.pptx" OPEN NEST SLIDE ... CLOSE NEST SET ?fileBuild and save a PPTX presentation
SLIDE LAYOUT "type" [DURATION "3s"] OPEN NEST ... CLOSE NESTDefine a slide. DURATION enables auto-advance for that slide.

RICH [pending — deferred session]

RTF document construction. A4 or 16:9. LibreOffice for export. See RICH docs →

VerbDescription
RICH NEW AS "A4"|"16:9" SET ?docCreate new blank document
RICH OPEN "/root/path.rtf" SET ?docOpen existing RTF file
RICH INSERT ?doc WITH "content" AS "type" AT ... SET ?docInsert element (heading, paragraph, image, table, chart, shape, divider)
RICH FORMAT ?doc FROM LINE n COL n TO LINE n COL n ... SET ?docFormat text range
RICH SAVE ?doc [INTO "/root/path"] SET ?docSave document
RICH EXPORT ?doc AS "pdf"|"docx"|"pptx"|"html" INTO "/root/path" SET ?pathExport to target format via LibreOffice

APPLICATE [pending]

Package apps for any platform from a source folder. See APPLICATE docs →

VerbDescription
APPLICATE TYPE "target" FROM "/root/folder/" TO "/root/out" [SIGN WITH "key"] [AS "bundle.id"] [TITLE "Name"] SET ?filePackage source folder as native app. Targets: android/apk, android/aab, windows/exe, windows/installer, macos/app, ios/app, linux/app, linux/appimage, linux/deb, linux/rpm, web/pwa. Omit SIGN WITH to use Ocalt default signer.

DIRECTIVE [pending]

Execute OQL on a registered remote machine via the oql-client agent. See DIRECTIVE docs →

VerbDescription
DIRECTIVE "machine-id" OPEN NEST ... CLOSE NEST SET ?resultRun OQL block on remote agent. No inbound ports required.
DIRECTIVE LIST SET ?agents→ array of registered agent objects
DIRECTIVE STATUS "id" SET ?status→ agent status object

Push subscription verbs — updated

VerbDescription
NOTIFY CHECK PUSH STATUS FOR ?uid SET ?boolCheck if user has an active push subscription — returns boolean
NOTIFY REQUEST PUSH GRANT FOR ?uid WITH "return_url"Redirect browser to notifications.ocalt.com consent portal. On grant, redirects to return_url.
PUSH SUBSCRIBE ?sub AS ?uid SET ?okStore push subscription for user identifier
PUSH UNSUBSCRIBE ?uid SET ?nRemove all subscriptions for user identifier

Calendar — new modifiers

ModifierDescription
LOCATION "string"Event location — available on CREATE EVENT
REMIND "15m"|"1h"|"2d"Reminder timing before event start — available on CREATE EVENT
ON TRIGGER OPEN NEST ... CLOSE NESTOQL block executed when the reminder fires — available on CREATE EVENT

SSH [pending]

Execute commands on remote machines over SSH. Replaces EXEC/SPAWN/KILL in standard OQL. See SSH docs →

VerbDescription
SSH "user" AT "host" PASSWORD "pass" ENTER `cmd` SET ?rSingle command via password. Default port 22. → {stdout, stderr, exit_code}
SSH "user" AT "host" KEY "/root/key" ENTER `cmd` SET ?rSingle command via key auth.
SSH "user" AT "host" [auth] ON "port" ENTER `cmd` SET ?rCustom port.
SSH "user" AT "host" [auth] OPEN NEST ENTER `...` AFTER ENTER `...` CLOSE NEST SET ?rMulti-command block.
SSH "user" AT "host" [auth] UPLOAD "/root/src" TO "/remote/dst"OQL storage → remote machine.
SSH "user" AT "host" [auth] DOWNLOAD "/remote/src" INTO "/mounted/dst" SET ?pathRemote machine → OQL storage.

TUNNEL [pending]

Peer-to-peer data/file transfer between any two endpoints. Chunked. See TUNNEL docs →

VerbDescription
NEW TUNNEL SET ?roomAllocate tunnel room. Must be outside DIRECTIVE. → room object
TUNNEL SEND "path"|"rtsp://url" TO ?roomJoin as sender. Legal inside DIRECTIVE.
TUNNEL RECEIVE ?room INTO "/mounted/path" SET ?pathJoin as receiver. Writes to OQL storage.
TUNNEL CLOSE ?roomExplicitly close tunnel room.

TRANSCODE

FFmpeg-powered media conversion. RTSP is a first-class input source. See TRANSCODE docs →

VerbDescription
TRANSCODE "source" AS "format" INTO "/mounted/out" SET ?pathConvert media. Source: file path, RTSP URL, HTTP stream URL, TUNNEL room, bridge peer URL. → virtual path

CHAT [pending — needs refinement]

Built-in chat rooms with named peers, auto-timestamped messages, message IDs and delivery status. See CHAT docs →

VerbDescription
CHAT WITH "n" PEERS "alias1" AND "alias2" ... SET ?roomCreate chat room with named peers. → room object
CHAT ENTRY FROM "alias" MESSAGE `text` TO ?room SET ?msgSend message. Auto-timestamps. → message object {id, from, message, timestamp, status, room_id}

REDIRECT

HTTP redirect response. See REDIRECT docs →

VerbDescription
REDIRECT "url"302 redirect. AS omitted defaults to 302.
REDIRECT "url" AS "301"|"302"Permanent or temporary redirect.

EXEC / SPAWN / KILL — directive-only

VerbDescription
EXEC "command" [WITH "stdin"] SET ?rRun shell command on target machine. → {stdout, stderr, exit_code}. Error if called outside DIRECTIVE.
SPAWN "command" SET ?pidStart background process on target machine. → PID. Error if called outside DIRECTIVE.
KILL ?pid SET ?okSIGTERM process on target machine. → boolean. Error if called outside DIRECTIVE.