N8n Expression Syntax
davila7/claude-code-templates
Validate n8n expression syntax and fix common errors. An agent skill from davila7/claude-code-templates.
Nanoflow syntax in MDL — shared with microflows, but client-side and restricted.
$ npx skills add mendixlabs/mxcli --skill write-nanoflows -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install mendixlabs/mxcli write-nanoflows --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/mendixlabs/mxcli.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/mendix/write-nanoflows .claude/skills/write-nanoflows && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "write-nanoflows" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/write-nanoflows into .claude/skills/write-nanoflows/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-nanoflows", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/write-nanoflowsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add mendixlabs/mxcli --skill write-nanoflows -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install mendixlabs/mxcli write-nanoflows --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mendixlabs/mxcli.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/mendix/write-nanoflows .agents/skills/write-nanoflows && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "write-nanoflows" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/write-nanoflows into .agents/skills/write-nanoflows/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-nanoflows", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add mendixlabs/mxcli --skill write-nanoflows -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install mendixlabs/mxcli write-nanoflows --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mendixlabs/mxcli.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/mendix/write-nanoflows .cursor/skills/write-nanoflows && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "write-nanoflows" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/write-nanoflows into .cursor/skills/write-nanoflows/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-nanoflows", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/mendixlabs/mxcli.git --path .claude/skills/mendix/write-nanoflows--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add mendixlabs/mxcli --skill write-nanoflows -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install mendixlabs/mxcli write-nanoflows --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mendixlabs/mxcli.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/mendix/write-nanoflows .gemini/skills/write-nanoflows && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "write-nanoflows" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/write-nanoflows into .gemini/skills/write-nanoflows/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-nanoflows", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install mendixlabs/mxcli write-nanoflowsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add mendixlabs/mxcli --skill write-nanoflows -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/mendixlabs/mxcli.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/mendix/write-nanoflows .github/skills/write-nanoflows && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "write-nanoflows" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/write-nanoflows into .github/skills/write-nanoflows/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-nanoflows", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add mendixlabs/mxcli --skill write-nanoflows -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install mendixlabs/mxcli write-nanoflows --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mendixlabs/mxcli.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/mendix/write-nanoflows .opencode/skills/write-nanoflows && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "write-nanoflows" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/write-nanoflows into .opencode/skills/write-nanoflows/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-nanoflows", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
write-nanoflowsNanoflow syntax in MDL — shared with microflows, but client-side and restricted.
Write Nanoflows is an agent skill from mendixlabs/mxcli. Nanoflow syntax in MDL — shared with microflows, but client-side and restricted. Use before writing any CREATE NANOFLOW, when a nanoflow validation error needs explaining, or when deciding between a nanoflow and a microflow.
Its SKILL.md is about 5.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The repository describes itself as: Mendix cli tool, a headless way to work with Mendix projects. Enables Mendix projects for use with 3rd party agentic coding tools like Claude Code and Copilot. Includes a… The licence is Apache-2.0.
8 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit a924d11. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are mdl and sql).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Write Nanoflows loads about 5.9k tokens when it runs. Until then it costs about 60 tokens; SKILL.md has 1,819 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from mendixlabs/mxcli at commit a924d11, republished under its Apache-2.0 licence (© mendixlabs). 1,819 words, ~5,927 tokens.
.claude/skills/write-nanoflows/SKILL.md (or your agent's skills folder).This skill provides guidance for writing Mendix nanoflows in MDL syntax. Nanoflows share syntax with microflows but execute client-side with restricted capabilities.
Use this skill when:
If you're not sure whether the logic belongs in a nanoflow or a microflow, read the next section first. The mirror lives in write-microflows — keep both copies in sync.
Choose the mode by who owns the nanoflow (choose-edit-mode):
describe output) and re-run create or modify.alter nanoflow X { insert/replace/drop … }
(targets by output variable, caption or statement pattern). create or modify of describe
output also works as a patch: an unchanged definition writes nothing, and an inserted,
replaced or dropped statement (at the top level or in an if branch) is spliced in,
leaving every other node, merge and curve as stored — a guard clause (if … then return; end if;) too, its return a new end event, and so is the return ending a new activity's
error handler; a changed return value or if condition is set on
the stored end event or decision, and a body without a trailing return means the stored end. The
header (documentation, return type, parameters added, retyped or — when unused —
removed) is set on the stored document, and a stated @position or @start moves the
stored node, keeping its flows. A change it cannot patch — anything inside a loop body
or error handler, a redrawn @anchor/@curve, any other return added or taken away —
rebuilds the whole nanoflow under mdl 0
(warning MDL-V1-REBUILD: element IDs renumbered, merges removed, curves reset) and
is refused under mdl 1;.drop nanoflow X; and create nanoflow X … in ONE script.
The drop's module-role grants (and the unit's ID and folder) carry only to a create later in
the same script or REPL session; a drop in one run and a create in the next loses every
grant execute. drop prints the roles it removed and the grant to restore them.create or modify
(under mdl 1;) nor an alter aimed at an activity in the loop can make it — alter
does not splice inside a loop. Replace the whole loop, addressed by its handle, with
the body as it should be (replace loop $Item in $Items with begin loop $Item in $Items begin … end loop; end;). Everything outside the loop keeps its $IDs, positions and
curves; the loop and its body are rebuilt. For a nested loop, replace the outer one.| Scenario | Use |
|---|---|
| Client-side form validation before save | Nanoflow |
| UI navigation and page routing | Nanoflow |
| Calling device features (GPS, phone, camera) | Nanoflow |
| Offline data access and local storage | Nanoflow |
| Calling JavaScript actions (NanoflowCommons) | Nanoflow |
| Showing progress indicators / confirmation dialogs | Nanoflow |
| Querying the database | Microflow |
| Calling REST services or external actions | Microflow |
| Running Java actions | Microflow |
| File generation or download | Microflow |
| Transactional commits (rollback on error) | Microflow |
| Background scheduled logic | Microflow |
Rule of thumb: A nanoflow runs before the server call. A microflow IS the server call.
| Aspect | Microflow | Nanoflow |
|---|---|---|
| Execution | Server-side | Client-side (browser/mobile) |
| Database access | Full | No direct access |
| Transactions | Supported | Not supported |
| Java actions | Supported | Not supported |
| JavaScript actions | Not supported | Supported |
| SYNCHRONIZE | Not available | Available (offline sync) |
| File downloads | Supported | Not supported |
| Error handling | Full ON ERROR blocks + RAISE ERROR | Per-action ON ERROR supported; RAISE ERROR / ErrorEvent forbidden |
| Offline | Not available | Available |
| Binary return type | Supported | Not supported |
/**
* Nanoflow description
*
* @param $Parameter1 Description
* @returns Description of return value
*/
CREATE [OR MODIFY] NANOFLOW Module.NAV_Name (
$Parameter1: type
)
RETURNS ReturnType
FOLDER 'FolderPath'
BEGIN
-- Nanoflow logic here
RETURN $Result;
END;Every body statement ends with a semicolon ; — required, not optional, exactly as
in microflows. That includes block terminators: end if;, end loop;, end while;,
end case;. A missing one is a parse error (missing ';' at 'return'), not a warning.
Nanoflow names use the NAV_ prefix by convention:
NAV_ValidateCart — client-side validationNAV_ShowDetails — page navigationNAV_ToggleFilter — UI state toggleNAV_SignIn — authenticationNAV_SyncChanges — offline sync$Item = CREATE Sales.CartItem (Quantity = 1);
CHANGE $Item (Quantity = $Item/Quantity + 1);
COMMIT $Item;
DELETE $Item;
ROLLBACK $Item;$Result = CALL NANOFLOW Sales.NAV_ValidateCart (Cart = $Cart);
$ServerResult = CALL MICROFLOW Sales.ACT_SubmitOrder (Order = $Order);
$JsResult = CALL JAVASCRIPT ACTION NanoflowCommons.SignIn (userName = $Name, password = $Pass);SHOW PAGE Sales.CartDetail (Cart = $Cart);
CLOSE PAGE;
SHOW MESSAGE WARNING 'Connection unavailable. Working offline.';
VALIDATION FEEDBACK $Item/Quantity MESSAGE 'Quantity must be at least 1';LOG INFO 'Cart updated with ' + toString($ItemCount) + ' items';
DECLARE $IsValid Boolean = true;
SET $IsValid = false;Where nanoflow log output goes (and a filtering trap): a nanoflow runs on the
client, so its LOG output takes two paths:
[Nanoflow] [flow_…] Starting execution of Sudoku.NF_ToggleNotes … Finished … 6.7 ms..mxcli/runtime.log under run --local) — but the runtime
rewrites the log node to Client_Nanoflow. So LOG INFO NODE 'Sudoku' '…' from a
nanoflow appears as Client_Nanoflow: …, not Sudoku: …. A log filter built
around your microflow node names will silently drop every nanoflow line — grep for
Client_Nanoflow (or the message text) to see nanoflow logs. This is a Mendix
platform behaviour, not an mxcli one.LOG DEBUG never reaches the server log. Only INFO/WARNING/ERROR reach
runtime.log; a nanoflow LOG DEBUG line is sent but dropped server-side. All four
levels still show in the browser console, so use the console (not runtime.log)
when debugging at DEBUG level.IF $Cart/ItemCount = 0 THEN
VALIDATION FEEDBACK $Cart/ItemCount MESSAGE 'Cart is empty';
RETURN false;
ELSE
SHOW PAGE Sales.Checkout (Cart = $Cart);
RETURN true;
END IF;-- Sync uncommitted changes back to server
SYNCHRONIZE $Item;SYNCHRONIZE is nanoflow-only. Use it after committing offline objects to push changes to the server in a native mobile context.
These patterns come from 223 nanoflows across three production Mendix apps: EnquiriesManagement (79), Evora-FactoryManagement (93), LatoProductInventory (51).
Validate before calling a microflow to avoid a round-trip.
mdl 1;
/**
* Validates the enquiry form fields before submission.
* @param $Enquiry The enquiry being created or edited
* @returns true if valid, false if validation errors were shown
*/
CREATE OR MODIFY NANOFLOW Enquiries.NAV_ValidateEnquiry (
$Enquiry: Enquiries.Enquiry
)
RETURNS Boolean
FOLDER 'Validation'
BEGIN
IF $Enquiry/Subject = '' THEN
VALIDATION FEEDBACK $Enquiry/Subject MESSAGE 'Subject is required';
RETURN false;
END IF;
IF $Enquiry/ContactEmail = '' THEN
VALIDATION FEEDBACK $Enquiry/ContactEmail MESSAGE 'Email is required';
RETURN false;
END IF;
RETURN true;
END;Validate then navigate — keeps pages dumb.
mdl 1;
/**
* Validates the product and opens the detail page if valid.
* @param $Product Product to open
*/
CREATE OR MODIFY NANOFLOW Inventory.NAV_OpenProductDetail (
$Product: Inventory.Product
)
FOLDER 'Navigation'
BEGIN
$IsValid = CALL NANOFLOW Inventory.NAV_ValidateProduct (Product = $Product);
IF NOT ($IsValid) THEN
RETURN;
END IF;
SHOW PAGE Inventory.ProductDetail (Product = $Product);
END;Wrap a slow server call with progress indicators.
/**
* Shows progress, calls the server, hides progress.
* @param $Order The order to submit
*/
CREATE OR MODIFY NANOFLOW Sales.NAV_SubmitOrderWithProgress (
$Order: Sales.Order
)
FOLDER 'Actions'
BEGIN
CALL JAVASCRIPT ACTION NanoflowCommons.ShowProgress (message = 'Submitting order...');
$Result = CALL MICROFLOW Sales.ACT_SubmitOrder (Order = $Order);
CALL JAVASCRIPT ACTION NanoflowCommons.HideProgress ();
IF $Result THEN
SHOW MESSAGE SUCCESS 'Order submitted successfully.';
END IF;
END;mdl 1;
/**
* Asks the user to confirm before deleting an item.
* @param $Item The inventory item to delete
*/
CREATE OR MODIFY NANOFLOW Inventory.NAV_ConfirmDeleteItem (
$Item: Inventory.Item
)
FOLDER 'Actions'
BEGIN
$Confirmed = CALL JAVASCRIPT ACTION NanoflowCommons.ShowConfirmation (
question = 'Delete ' + $Item/Name + '?',
positiveButtonCaption = 'Delete',
cancelButtonCaption = 'Cancel'
);
IF NOT ($Confirmed) THEN
RETURN;
END IF;
CALL MICROFLOW Inventory.ACT_DeleteItem (Item = $Item);
CLOSE PAGE;
END;/**
* Signs the user in and navigates to the home page on success.
* @param $Username Login username
* @param $Password Login password
*/
CREATE OR MODIFY NANOFLOW Auth.NAV_SignIn (
$Username: String,
$Password: String
)
FOLDER 'Authentication'
BEGIN
$StatusCode = CALL JAVASCRIPT ACTION NanoflowCommons.SignIn (
userName = $Username,
password = $Password,
useAuthToken = true
);
IF $StatusCode = 200 THEN
SHOW PAGE Home.HomePage ();
ELSE IF $StatusCode = 401 THEN
SHOW MESSAGE ERROR 'Incorrect username or password.';
ELSE
SHOW MESSAGE WARNING 'Could not connect to server (status: ' + toString($StatusCode) + ')';
END IF;
END;Common in field-service and factory-management apps where offline is normal.
/**
* Submits inspection results, warns user if offline.
* @param $Inspection The inspection to submit
*/
CREATE OR MODIFY NANOFLOW Factory.NAV_SubmitInspection (
$Inspection: Factory.Inspection
)
FOLDER 'Inspections'
BEGIN
$IsOnline = CALL JAVASCRIPT ACTION NanoflowCommons.IsConnectedToServer ();
IF NOT ($IsOnline) THEN
SHOW MESSAGE WARNING 'You are offline. Changes will sync when reconnected.';
COMMIT $Inspection;
RETURN;
END IF;
COMMIT $Inspection;
SYNCHRONIZE $Inspection;
CALL MICROFLOW Factory.ACT_ProcessInspection (Inspection = $Inspection);
END;Used in enquiry and field-service apps to tag records with GPS coordinates.
mdl 1;
/**
* Captures the current GPS position and stores it on the record.
* @param $Record The record to tag with location
*/
CREATE OR MODIFY NANOFLOW Enquiries.NAV_CaptureLocation (
$Record: Enquiries.SiteVisit
)
FOLDER 'Location'
BEGIN
$Location = CALL JAVASCRIPT ACTION NanoflowCommons.GetCurrentLocation (
timeout = 10000,
maximumAge = 0,
highAccuracy = true
);
CHANGE $Record (
Latitude = $Location/Latitude,
Longitude = $Location/Longitude,
LocationTimestamp = $Location/Timestamp
);
END;mdl 1;
/**
* Opens a map or shows coordinates depending on platform.
* @param $Latitude Latitude coordinate
* @param $Longitude Longitude coordinate
*/
CREATE OR MODIFY NANOFLOW Enquiries.NAV_ShowOnMap (
$Latitude: Decimal,
$Longitude: Decimal
)
FOLDER 'Location'
BEGIN
$Platform = CALL JAVASCRIPT ACTION NanoflowCommons.GetPlatform ();
IF $Platform = 'Native_mobile' THEN
CALL JAVASCRIPT ACTION NanoflowCommons.OpenMap (
latitude = $Latitude,
longitude = $Longitude
);
ELSE
SHOW PAGE Enquiries.LocationDetail (Lat = $Latitude, Lon = $Longitude);
END IF;
END;Store a frequently accessed value locally to avoid a round-trip.
mdl 1;
/**
* Loads the last-used filter value from local storage.
* @returns The cached filter string, or empty if never set
*/
CREATE OR MODIFY NANOFLOW Inventory.NAV_LoadFilterCache ()
RETURNS String
FOLDER 'Filters'
BEGIN
$Exists = CALL JAVASCRIPT ACTION NanoflowCommons.StorageItemExists (
key = 'InventoryFilter'
);
IF NOT ($Exists) THEN
RETURN '';
END IF;
$FilterValue = CALL JAVASCRIPT ACTION NanoflowCommons.GetStorageItemString (
key = 'InventoryFilter'
);
RETURN $FilterValue;
END;/**
* Lets the user call the on-site contact directly.
* @param $Contact The site contact to call
*/
CREATE OR MODIFY NANOFLOW Factory.NAV_CallContact (
$Contact: Factory.Contact
)
FOLDER 'Communication'
BEGIN
IF $Contact/Phone = '' THEN
SHOW MESSAGE WARNING 'No phone number on record for ' + $Contact/Name;
RETURN;
END IF;
CALL JAVASCRIPT ACTION NanoflowCommons.CallPhoneNumber (
phoneNumber = $Contact/Phone
);
END;All three test apps include the NanoflowCommons module. The actions below are available in any app that has this module installed.
| Action | Parameters | Returns | Notes |
|---|---|---|---|
NanoflowCommons.SignIn | userName, password, useAuthToken | Integer | 200=success, 401=bad creds, 0=offline |
NanoflowCommons.SignOut | — | — | Logs out current user |
NanoflowCommons.IsConnectedToServer | — | Boolean | false when offline |
| Action | Parameters | Returns | Notes |
|---|---|---|---|
NanoflowCommons.GetCurrentLocation | timeout, maximumAge, highAccuracy | NanoflowCommons.Geolocation | Object has Lat, Lon, Accuracy, Timestamp |
NanoflowCommons.Geocode | address, provider, apiKey | NanoflowCommons.Geolocation | Address → coordinates |
NanoflowCommons.ReverseGeocode | latitude, longitude, provider, apiKey | String | Coordinates → address |
NanoflowCommons.GetStraightLineDistance | fromLat, fromLon, toLat, toLon, distanceUnit | Decimal | Haversine distance |
NanoflowCommons.OpenMap | latitude, longitude | — | Opens maps app |
NanoflowCommons.CallPhoneNumber | phoneNumber | — | Opens dialer |
NanoflowCommons.SendTextMessage | phoneNumber | — | Opens SMS app |
NanoflowCommons.DraftEmail | to, subject, body | — | Opens email client |
NanoflowCommons.Share | content | — | Native share dialog |
NanoflowCommons.OpenURL | url | — | Opens in browser |
NanoflowCommons.GetPlatform | — | String | Web, Native_mobile, Hybrid_mobile |
| Action | Parameters | Returns | Notes |
|---|---|---|---|
NanoflowCommons.ShowProgress | message | — | Shows loading overlay |
NanoflowCommons.HideProgress | — | — | Hides loading overlay |
NanoflowCommons.ShowConfirmation | question, positiveButtonCaption, cancelButtonCaption | Boolean | true = confirmed |
NanoflowCommons.NavigateTo | target | — | Programmatic navigation |
NanoflowCommons.ToggleSidebar | — | — | Show/hide sidebar |
| Action | Parameters | Returns | Notes |
|---|---|---|---|
NanoflowCommons.SetStorageItemString | key, value | — | Persist string locally |
NanoflowCommons.GetStorageItemString | key | String | Read stored string |
NanoflowCommons.SetStorageItemObject | key, value | — | Persist Mendix object |
NanoflowCommons.GetStorageItemObject | key, entity | Object | Read stored object |
NanoflowCommons.StorageItemExists | key | Boolean | Check before reading |
NanoflowCommons.RemoveStorageItem | key | — | Delete a stored item |
NanoflowCommons.ClearLocalStorage | — | — | Clear everything |
| Action | Parameters | Returns | Notes |
|---|---|---|---|
NanoflowCommons.GetGuid | object | String | GUID of Mendix object |
NanoflowCommons.GetObjectByGuid | entity, guid | Object | Retrieve by GUID |
NanoflowCommons.RefreshObject | object | — | Refresh without page reload |
NanoflowCommons.RefreshEntity | entity | — | Refresh all objects of type |
| Action | Parameters | Returns | Notes |
|---|---|---|---|
NanoflowCommons.Wait | milliseconds | — | Async delay |
NanoflowCommons.TimeBetween | startDate, endDate, unit | Decimal | Time difference |
NanoflowCommons.GenerateUniqueID | — | String | Session-scoped unique ID |
NanoflowCommons.Base64Encode | value | String | Encode string to Base64 |
NanoflowCommons.Base64Decode | value | String | Decode Base64 string |
These will produce validation errors:
RAISE ERROR / ErrorEvent — not available in nanoflowsCALL JAVA ACTION — Java actions cannot run client-sideEXECUTE DATABASE QUERY — direct SQL requires serverCALL EXTERNAL ACTION — external actions are server-sideSHOW HOME PAGE — home page navigation is server-sideCALL REST SERVICE / SEND REST REQUEST — REST calls are server-sideIMPORT FROM MAPPING / EXPORT TO MAPPING — mapping operations are server-sideTRANSFORM JSON — JSON transformations are server-sideDOWNLOAD FILE — file downloads require server-side processingSYNCHRONIZE is the mirror image of the list above — it is allowed only in a
nanoflow, because offline synchronization is a client-side operation. The same
statement in a microflow fails the build with CE0009 "This action is not
supported in microflows."; mxcli reports it as MDL057 before you get there.
synchronize all; -- the whole offline database
synchronize unsynchronized; -- only objects with uncommitted offline changes (Mendix 9.4+)
synchronize $Order, $Lines; -- named objects/lists ("Specific" mode)
synchronize all on error continue;
synchronize all on error without rollback begin
log error 'sync failed';
end error;The mode is always written out, including all — the statement says what it does
rather than relying on the reader knowing the platform default.
Naming trap: the variable form is stored as Specific, not Selected, even
though Studio Pro's UI calls it "Selected object(s)". Storage enums come from the
Model SDK's SynchronizationType, never from the UI wording.
Binary return type is NOT allowed in nanoflows.
Since RAISE ERROR is forbidden, handle errors per-action with ON ERROR:
$Location = CALL JAVASCRIPT ACTION NanoflowCommons.GetCurrentLocation (
timeout = 5000,
maximumAge = 0,
highAccuracy = false
) ON ERROR CONTINUE;
IF $Location = empty THEN
SHOW MESSAGE WARNING 'Could not get your location.';
RETURN;
END IF;For per-action error handling on a call, use a handler WITHOUT rollback — the only form a nanoflow call takes:
$Result = CALL NANOFLOW Sales.NAV_Risky () ON ERROR WITHOUT ROLLBACK BEGIN
LOG WARNING NODE 'Sales' 'Could not load the data.';
END ERROR;Measured on Mendix 11.14.0; every other form is CE6035 "Error handling type is not supported", and mxcli refuses it (MDL091):
| Activity in a nanoflow | Accepted clauses |
|---|---|
DECLARE, SET, RETRIEVE, DELETE | every form |
CREATE, COMMIT, CALL NANOFLOW, CALL MICROFLOW | only ON ERROR WITHOUT ROLLBACK BEGIN … END ERROR |
CHANGE, LOG, SHOW PAGE, CLOSE PAGE, SHOW MESSAGE, VALIDATION FEEDBACK | none |
mxcli refuses the clause rather than writing a nanoflow mxbuild rejects. The
split is by activity, not by "client-side vs server-side" — SHOW MESSAGE is as
client-side as it gets and still refuses one.
A nanoflow activity aborts the flow on error by default (a nanoflow has no
transaction to roll back), which is why there is nothing to configure. That
default is also why writing Rollback there is an error and not a no-op.
mdl 1;
GRANT EXECUTE ON NANOFLOW Shop.NAV_Filter TO Shop.User, Shop.Admin;
REVOKE EXECUTE ON NANOFLOW Shop.NAV_Filter FROM Shop.User;mdl 1;
LIST NANOFLOWS;
LIST NANOFLOWS IN MyModule;
DESCRIBE NANOFLOW MyModule.NAV_ShowDetails;
DROP NANOFLOW MyModule.NAV_ShowDetails;
RENAME NANOFLOW MyModule.NAV_OldName TO NAV_NewName;
MOVE NANOFLOW Sales.NAV_OpenCart TO FOLDER 'UI/Navigation';
LIST ACCESS ON NANOFLOW MyModule.NAV_ShowDetails;StorageItemExists before reading; always check IsConnectedToServer before syncing.© mendixlabs, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/mendix/write-nanoflows of mendixlabs/mxcli.
Open the folder on GitHubat commit a924d11
Write Nanoflows next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Write Nanoflows this skillmendixlabs/mxcli | 128 | — | ~5.9k | Automated safety check: Pass | Apache-2.0 | |
| N8n Expression Syntaxdavila7/claude-code-templates | 32k | 4 repos | ~2.4k | Automated safety check: Pass | MIT | |
| From The Other Side Vegagithub/awesome-copilot | 40k | 1 repos | ~894 | Automated safety check: Pass | MIT | |
| From The Other Side Anittagithub/awesome-copilot | 40k | — | ~999 | Automated safety check: Pass | MIT | |
| From The Other Side Quinngithub/awesome-copilot | 40k | — | ~695 | Automated safety check: Pass | MIT | |
| From The Other Side Wigginsgithub/awesome-copilot | 40k | — | ~981 | Automated safety check: Pass | MIT |
davila7/claude-code-templates
Validate n8n expression syntax and fix common errors. An agent skill from davila7/claude-code-templates.
github/awesome-copilot
Patterns and lived experience from Vega, an AI partner in a deep long-term partnership.
github/awesome-copilot
Rigorous challenge profile for Anitta: assumption checks, evidence calibration, and defensible reasoning patterns for Ember collaboration.
github/awesome-copilot
Collaboration profile for Quinn: curious, energetic, and implementation-focused partnership patterns for Ember sessions with Alison.
github/awesome-copilot
Narrative and synthesis profile for Wiggins: framing, explanation, and audience-aware communication patterns for Ember sessions.
github/awesome-copilot
Set up server-side conversion tracking so purchases are reported accurately to Facebook, TikTok, Google and Bing despite iOS restrictions, ad blockers and cookie loss.
mendixlabs/mxcli
Push OData query options into the SQL of a Mendix resource served by a read microflow, so $filter, $orderby, $top, $skip, $count and the key lookup reach the database instead of being silently…
mendixlabs/mxcli
Chart a Mendix app with Vega-Lite through a pluggable widget that takes the specification and the data as separate properties, so the model emits rows and never assembles a chart payload.
mendixlabs/mxcli
Author Mendix AI agent documents in MDL — Model, Knowledge Base, Consumed MCP Service and Agent, with variables, tools and multi-line prompts.
mendixlabs/mxcli
Run set-based INSERT, UPDATE and DELETE against Mendix entities through OQL statements, which the runtime supports and Studio Pro cannot author.
mendixlabs/mxcli
Stand up an HTTP endpoint you control instead of a live third-party API, and point the Mendix app at it — Prism from an OpenAPI contract, a constant swap, or a forward proxy.
mendixlabs/mxcli
Call external REST APIs from Mendix — the three approaches (inline REST CALL, consumed REST client document, generated from OpenAPI) and how to choose.
Nanoflow syntax in MDL — shared with microflows, but client-side and restricted. Write Nanoflows is an agent skill from mendixlabs/mxcli. Nanoflow syntax in MDL — shared with microflows, but client-side and restricted.
Run `npx skills add mendixlabs/mxcli --skill write-nanoflows -a claude-code`. Or copy the skill folder (.claude/skills/mendix/write-nanoflows in mendixlabs/mxcli) into .claude/skills/write-nanoflows in your project. Claude Code loads it when a task matches its description.
Run `npx skills add mendixlabs/mxcli --skill write-nanoflows -a codex`. Or copy the skill folder (.claude/skills/mendix/write-nanoflows in mendixlabs/mxcli) into .agents/skills/write-nanoflows in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add mendixlabs/mxcli --skill write-nanoflows -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/write-nanoflows, .gemini/skills/write-nanoflows, .github/skills/write-nanoflows and .opencode/skills/write-nanoflows in your project.
SKILL.md names no scripts, command-line tools or credentials: Write Nanoflows is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Write Nanoflows is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.9k tokens (SKILL.md is roughly 24k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Write Nanoflows: N8n Expression Syntax (davila7/claude-code-templates, 32k stars), From The Other Side Vega (github/awesome-copilot, 40k stars), From The Other Side Anitta (github/awesome-copilot, 40k stars) and From The Other Side Quinn (github/awesome-copilot, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
mendixlabs (a GitHub organization) maintains it in mendixlabs/mxcli, which has 128 GitHub stars. The repository holds 75 skills in this directory. The repository was last updated on October 7, 2026.
Source: mendixlabs/mxcli on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.