MCP Development
coollabsio/coolify
A skill your agent uses for Laravel MCP development. An agent skill from coollabsio/coolify.
The SCSS workflow and its traps — where styling actually compiles, custom-variables.scss, themesource directories, hot reload, design-property errors, and the mxcli theme commands (apply, create…
$ npx skills add mendixlabs/mxcli --skill theme-styling -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install mendixlabs/mxcli theme-styling --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/theme-styling .claude/skills/theme-styling && 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 "theme-styling" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/theme-styling into .claude/skills/theme-styling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "theme-styling", 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/theme-stylingType 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 theme-styling -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install mendixlabs/mxcli theme-styling --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/theme-styling .agents/skills/theme-styling && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "theme-styling" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/theme-styling into .agents/skills/theme-styling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "theme-styling", 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 theme-styling -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install mendixlabs/mxcli theme-styling --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/theme-styling .cursor/skills/theme-styling && 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 "theme-styling" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/theme-styling into .cursor/skills/theme-styling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "theme-styling", 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/theme-styling--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 theme-styling -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install mendixlabs/mxcli theme-styling --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/theme-styling .gemini/skills/theme-styling && 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 "theme-styling" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/theme-styling into .gemini/skills/theme-styling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "theme-styling", 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 theme-stylingInstalls 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 theme-styling -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/theme-styling .github/skills/theme-styling && 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 "theme-styling" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/theme-styling into .github/skills/theme-styling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "theme-styling", 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 theme-styling -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 theme-styling --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/theme-styling .opencode/skills/theme-styling && 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 "theme-styling" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/theme-styling into .opencode/skills/theme-styling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "theme-styling", 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.
theme-stylingThe SCSS workflow and its traps — where styling actually compiles, custom-variables.scss, themesource directories, hot reload, design-property errors, and the mxcli theme commands (apply, create…
Theme Styling is an agent skill from mendixlabs/mxcli. The SCSS workflow and its traps — where styling actually compiles, custom-variables.scss, themesource directories, hot reload, design-property errors, and the mxcli theme commands (apply, create --from a design, switchable sets, light/dark). Use when writing or debugging SCSS, when applying or building a theme, when giving an app a brand palette or design tokens, or when styling silently fails to appear.
Its SKILL.md is about 5.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Frontend & Design, covering CSS and styling and Design tokens. 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.
7 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.
Shell commands in SKILL.md call:
dockerFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use docker, which can reach the network depending on how they are called.
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.
Theme Styling loads about 5.5k tokens when it runs. Until then it costs about 105 tokens; SKILL.md has 2,610 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). 2,610 words, ~5,473 tokens.
.claude/skills/theme-styling/SKILL.md (or your agent's skills folder).Use this skill when working with:
custom-variables.scss, or themesource/ directoriesmxcli theme apply | create | switcher)Do not hand-write a theme scaffold. mxcli theme apply writes a complete,
verified one; mxcli theme create <name> --from <design-file> makes a theme the
project owns and seeds its palette from --mxt-* declarations. See "A theme of
your own" below. Hand-editing inside a generated block works exactly once — the
digest fence refuses it on the next apply.
For MDL styling commands (list design properties, describe styling, alter styling, inline designproperties:, update widgets), see:
docs/11-proposals/page-styling-support.mdmdl-examples/doctype-tests/12-styling-examples.mdl (595 lines)mdl/executor/cmd_styling.go, mdl/executor/theme_reader.goMyProject/
├── theme/ # project-level overrides
│ └── web/
│ ├── main.scss # SCSS entry point (import chain)
│ ├── custom-variables.scss # project variable overrides
│ ├── exclusion-variables.scss # Exclude unwanted Atlas components
│ └── settings.json # Theme settings
│
├── themesource/ # module-level theme definitions
│ ├── atlas_core/ # base framework (always present)
│ │ └── web/
│ │ ├── design-properties.json # widget design properties
│ │ ├── variables.scss # Color/spacing/font variables
│ │ └── ... # Component SCSS files
│ ├── datawidgets/ # DataGrid2, gallery, etc.
│ ├── atlas_web_content/ # Web content styles
│ └── <module_name>/ # Each module can contribute styles
│ └── web/design-properties.json
│
└── theme-cache/web/ # Compiled CSS output (build artifact)atlas_core/web/main.scss imports in order:
atlas_core)theme/web/custom-variables.scss)Then each module's themesource/<module>/web/main.scss, and last of all
theme/web/main.scss.
Variables declared earlier are overridden by later declarations (with !default flag). This means custom-variables.scss overrides atlas_core/web/variables.scss values.
Verified against a real Mendix 11.13 project (probe rules compiled with
mxbuild --target=deploy, then grepped out of theme-cache/web/theme.compiled.css).
1. theme/web/main.scss compiles LAST — it is the right home for app styling.
After Atlas Core and after every module theme source, so a partial imported
here overrides any Atlas rule with no !important. It is a three-line file of
Mendix's own imports, not an Atlas-owned file; appending one @import is safe:
@import "custom-variables";
@import "theme-dark";
@import "theme-neutral";
@import "my-app"; // -> theme/web/_my-app.scss2. A themesource/<name>/ folder is only compiled when <name> is a real module.
mxbuild walks the model's modules and pulls each one's theme source; it never
globs the directory. An invented folder (themesource/my_theme/) is silently
skipped — build succeeds, rules simply absent. Use a module's theme source only
when the styling belongs to that module (it then exports with the .mpk).
Debugging "my CSS doesn't apply": first prove the file is compiled at all — grep a unique probe selector in
theme-cache/web/theme.compiled.css. Absent and overridden look identical in the browser, and only one of them is a specificity problem.
3. theme/web/custom-variables.scss is imported once PER MODULE (8× in a
blank app). It must hold declarations only — a CSS rule there is emitted once
per module. Tokens go here; rules go in the Layer-2 partial.
The stock theme/web/custom-variables.scss is a :root { --brand-primary: … }
block plus a few SCSS switches ($font-family-import, $btn-bordered,
$use-css-variables). Legacy Sass variables are still mapped
(_css-variables-mappings.scss), but the modern idiom is :root declarations.
The derived ramp (--brand-primary-50…900) is built with CSS color-mix()
against var(--brand-primary), so retuning the primary re-derives the whole ramp
live — no SCSS recompilation of variants needed.
theme/web/theme/web/<subdir>/ is copied to the deployment web root, and
theme.compiled.css is served from that root — so fonts at
theme/web/fonts/x.woff2 are referenced as url("./fonts/x.woff2"). Prefer this
over @import url('…fonts.googleapis…'): no @import-ordering trap, no
third-party request per page load, and the app renders correctly air-gapped.
mxcli theme apply does exactly this — see mxcli theme show signal.
mxcli theme createDon't hand-edit a generated block to get a brand palette. The block is
digest-fenced, so the next theme apply refuses to touch it and reports your
file as modified — you have taken the theme out of mxcli's hands to change one
colour. Scaffold a theme the project owns instead:
mxcli theme create acme -p app.mpr # scaffold from signal
mxcli theme create acme -p app.mpr --from console # ...or from console
mxcli theme create acme -p app.mpr --from design.css # ...and seed the palette
mxcli theme apply acme -p app.mprIt lands in theme/mxcli-themes/<name>/ — committed (unlike .mxcli/, which
mxcli init gitignores) and not compiled (mxbuild's entry point is
theme/web/main.scss; it does not glob theme/). From then on it is a theme
like any other: theme list -p shows it marked local, theme apply installs
it, theme remove takes it out. A local theme named after a built-in shadows it.
Seeding from a design. --from <file> reads --mxt-* declarations out of
any CSS-shaped text — a stylesheet, an SCSS partial, or the <style> blocks of
an HTML export:
:root { --mxt-brand: #7f5af0; --mxt-ground: #fffffe; }
@media (prefers-color-scheme: dark) { :root { --mxt-ground: #16161a; } }A dark block (prefers-color-scheme: dark, .theme-dark, [data-theme="dark"])
seeds the dark palette; everything else seeds the light one. Tokens the design
does not name keep the base theme's value. A design with only a base palette
does not touch the other variant — it keeps the base theme's palette, and
create says so. To retheme dark mode too, emit a dark block (a light one for
a dark-first base such as console).
If you are driving a design step (/design or similar) that will feed this, ask
it to emit a token block rather than inferring one from the mockup. Two greys
in a design do not say which is the app ground and which is a hovered row;
mxcli theme show signal prints the exact vocabulary to target. A --mxt-* name
the base theme does not declare is refused, because nothing would read it — the
theme would apply cleanly and render unchanged.
mxcli theme apply signal ledger console -p app.mpr # first named is the default
mxcli theme switcher install -p app.mpr --module MyFirstModuleAll of them compile into one stylesheet; the app picks one with a class on
<html>. No rebuild, no reload. This is the CSS Zen Garden result for Mendix:
the DOM Mendix renders never changes and neither does the model — brand, ground,
ink, radius, type and card treatment all move on a class swap. Measured on a real
11.13 app: signal #0f6e6b/4px/IBM Plex with shadowed cards, ledger
#1f3a5f/2px/Source Sans with hairlines, console #2dd4bf/6px/Space Grotesk
flat.
Two things make it work, and both are worth knowing if you write a theme:
var(--mxt-*), so one
copy of them serves every theme. A literal in any of those files survives the
swap and is wrong under every theme but one.:root minus the other skins' classes, not a
bare :root. Bare keeps matching once another class is set, so its rules leak
under every other theme and the winner comes down to specificity. Negation
makes the scopes mutually exclusive.A single installed theme is emitted exactly as before — bare :root, skin rules
unscoped — so this costs a one-theme project nothing.
Not theme-specific, but the theme switcher is where it bit. mxbuild lowers the first letter of a parameter when it generates the action wrapper:
create or modify javascript action Mod.SetAppSkin(Skin: String) ...// javascriptsource/mod/actions/SetAppSkin.js — regenerated on every build
export async function SetAppSkin(skin) { // ← lowercasedSo the body must read skin, not Skin. Using the modelled spelling is a
ReferenceError on the first click, and nothing catches it before then:
mx check reports 0 errors because the action is well-formed and the body is
opaque user code, mxcli check says nothing about JavaScript, and the file
carries Only the following code will be retained — it is rewritten on every
build, so it cannot be patched in place. The fix has to go back through MDL.
Model the parameter capitalised, as Mendix does; read it lowercased.
theme/web/_theme-dark.scss and _theme-neutral.scss declare :root.theme-dark
and :root.theme-neutral. Nothing in Atlas ever applies those classes — grep
themesource/ and you will find no reference. They are a slot for you to drive.
Three consequences worth knowing before building any light/dark support:
theme-dark to <html> on
a running Mendix 11 app turns the page ground, cards, form controls, sidebar,
buttons and DataGrid2 dark, with no per-widget CSS. This is materially better
than Atlas 3, where the same trick left widgets light. And because the class
is on <html>, popups and modals rendered at <body> follow it too._theme-dark.scss hardcodes
stock Mendix blue at :root.theme-dark. Declare the same selector from a file
imported later in theme/web/main.scss — same specificity, later wins — or
your brand vanishes the moment the class appears.--bg-color: var(--my-ground)) so a variant restates the tokens, not the
wiring. A hardcoded --font-color-default is invisible on a dark ground.The rail is the one place Atlas still assumes: several topbar widgets paint text
with --color-base, expecting white, because they expect a dark navigation rail.
Keep the rail dark in both variants, or force color: inherit on those widgets.
For a working implementation of all of the above, read the generated
theme/web/_mxcli-atlas-map.scss in any themed project.
Re-pointing Atlas's custom properties covers the app, and then a few things stay
stubbornly off-palette: the Data Grid 2 pager caption, row-select checkboxes,
popover shadows. One cause: the theme source shipped by the widget modules
(themesource/datawidgets, atlas_web_content) styles some things with Sass
variables and literals. Sass resolves those at compile time, before any custom
property exists, so the value is baked into theme.compiled.css and no token
can move it. Only a later CSS rule can.
The worst case is datawidgets/web/variables.scss:18,
$pagination-caption-color: #0a1325 — the "1–15 of 77" caption, which measured
1.02:1 on a dark ground. The pager buttons beside it were fine, because
they resolve var(--gray-darker, …) through Atlas. Same bar, two mechanisms.
The obvious fix does not work. Each module's main.scss imports
theme/web/custom-variables before its own !default variables, so setting
$pagination-caption-color: var(--my-muted) there would win and Sass would
substitute the var() into every use site. Tempting, and wrong here:
atlas_core/web/_variables.scss:20 computes
mix($brand-primary, #e7e7e9, 10%). Handing mix() a var() is a compile
error, so the app stops building._three-state-checkbox.scss writes #264ae5 and rgba(#264ae5, 0.4)
directly, so overriding $brand-primary would not reach them.So it is a rule set, in a partial imported after the theme's own — see the
generated theme/web/_mxcli-widgets.scss.
Read the compiled CSS, not the SCSS, when building one. The sources are full
of var(--token, #fallback) declarations that already resolve correctly; only
the bare literals are a problem. In one measured app the stock blue #264ae5
appeared in 46 declarations — 24 of them harmless fallbacks. Grepping the
source would have produced twice the rules for no benefit.
For theme/styling changes during Docker development:
# 1. Compile SCSS into deployment package (~55s)
mxcli docker build -p app.mpr
# 2. Push compiled CSS to browsers (instant, no page reload)
mxcli docker reload -p app.mpr --cssThe --css flag calls the M2EE update_styling action, which pushes CSS via WebSocket to all connected browsers. It does NOT compile SCSS — always run docker build first.
For non-CSS changes (Class, Style, DesignProperties on widgets), use normal reload:
mxcli docker reload -p app.mprNever apply style directly to a DYNAMICTEXT widget — it crashes MxBuild with a NullReferenceException. Wrap in a CONTAINER:
-- WRONG: crashes MxBuild
dynamictext txt (content: 'Hello', style: 'color: red;')
-- CORRECT: style the container
container ctn (style: 'color: red;') {
dynamictext txt (content: 'Hello')
}This also applies to alter styling and alter page set style — never target a DYNAMICTEXT widget with Style.
A sidebar item reading All task instead of All tasks is Atlas's closed
sidebar, which is an icon rail: --navsidebar-width-closed: 48px, set in Atlas's
own themesource/atlas_core/web/themes/_theme-default.scss. Measured against a
real compiled theme in a browser, the <a> for "All tasks" is 57px wide inside
a 48px rail — the same overflow reported from a live app (56 in 48).
No mxcli theme sets any navigation width; the themes map colours only. So this
reproduces identically under signal, ledger and console, in both variants —
a layout constant, not a palette.
The fix is in the app, not the theme:
Do not reach for text-overflow: ellipsis on the nav item as a blanket fix.
Tried and rejected: where Atlas does not also set white-space: nowrap, the label
wraps to two lines and reads fine — and the ellipsis rule turns that readable
All / tasks into All / t…. It trades one truncation for a worse one.
<div>s, Not a <table> — and Size Is a Flex WeightTwo surprises when styling a DataGrid2 matrix/pivot (ledger finding #46):
It is not a <table>. DataGrid2 emits role="grid" / role="row" /
role="gridcell" <div>s, so th, td { … } selectors match nothing. A
td { white-space: nowrap } intended to keep € 5,200 on one line does not
apply, and amounts wrap. Target the ARIA roles instead:
.ledger-matrix [role='gridcell'] { white-space: nowrap; }Playwright/tests see the same DOM: assert on [role="row"], not tr.
Size is a flex weight, not pixels. On a column, ColumnWidth: manual, Size: 132 does not set a 132px width — it divides available width by the
weights across all columns. To give a wide matrix room, set a min-width on the
grid and let it scroll:
.ledger-matrix [role='grid'] { min-width: 1320px; }
.ledger-matrix { overflow-x: auto; }Keys must match the name field in design-properties.json exactly:
-- CORRECT
designproperties: ('Spacing top': 'Large')
-- WRONG (case mismatch — silently ignored)
designproperties: ('spacing top': 'Large')Besides flat properties (a key with a single value — an option/dropdown
string or a toggle), designproperties: also supports compound properties:
one whose value is itself a set of sub-properties (e.g. Atlas's Spacing →
margin-top, margin-bottom, …). A compound value is written as a nested list:
designproperties: (
'Column gap': 'Medium', -- flat option
'Cards style': ON, -- flat toggle
'Spacing': ('margin-top': 'Large', 'margin-bottom': 'Medium') -- compound
)Supported on the modelsdk (.mpr) and MCP (live Studio Pro) backends.
Sub-property keys are case-sensitive, same as flat keys.
alter styling cannot find widgets in pages created by the MDL page builder because walkPageWidgets traverses LayoutCall.Arguments but the page parser doesn't fully reconstruct the widget tree when re-reading builder-created pages. These commands work on pages originally created in Studio Pro.
mxcli check -pWhen a project is supplied (mxcli check page.mdl -p app.mpr), design properties are
validated against the project's theme registry (themesource/*/web/design-properties.json):
Both are warnings (a newer theme may add keys/values), so they inform without blocking.
list design properties <widget> lists the same allowed keys/values up front. On the
write side, the value's BSON type is taken from the registry (a ColorPicker /
ToggleButtonGroup property serializes as a custom value, not a plain option).
style directly to DYNAMICTEXT — wrap in a CONTAINERdesign-properties.json exactly (check -p flags mismatches as MDL-WIDGET11/12)'Spacing': ['margin-top': 'Large']docker build then docker reload --cssdescribe styling to verify changes after modificationdocs/11-proposals/page-styling-support.md for BSON format detailsmxcli theme list/show/create/apply/remove/switcher, mxcli new --theme)three embedded themes (signal light-first, ledger light-first, console dark-first), each a palette in theme/web/custom-variables.scss + a shared Atlas wiring partial + a theme partial imported from theme/web/main.scss (which compiles last), plus vendored fonts. No model changes, so it hot-applies under run --local --watch and cannot affect a build. Generated regions are digest-fenced: a block carrying local edits is refused rather than overwritten. Applying a theme removes the previous one. --variant auto (default) ships both palettes — the app follows prefers-color-scheme before first paint and honours a theme-light/theme-dark class on <html>; light/dark bakes one. theme switcher install is the only part that writes to the model (JS actions + a nanoflow for a toggle button). A project can add its own themes under theme/mxcli-themes/<name>/ (committed, not compiled); theme create <name> [--from <theme|design-file>] scaffolds one from an existing theme, renaming the identifiers built from the name and optionally seeding the palette from --mxt-* declarations in a design artifact. A local theme shadows a built-in of the same name. Package: cmd/mxcli/theme/. See docs/11-proposals/PROPOSAL_default_styling.md
© 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/theme-styling of mendixlabs/mxcli.
Open the folder on GitHubat commit a924d11
Theme Styling 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 |
|---|---|---|---|---|---|---|
| Theme Styling this skillmendixlabs/mxcli | 128 | — | ~5.5k | Automated safety check: Pass | Apache-2.0 | |
| MCP Developmentcoollabsio/coolify | 63k | 1 repos | ~949 | Automated safety check: Pass | MIT | |
| Transitions PolishJakubantalik/transitions.dev | 4.6k | 2 repos | ~3.2k | Automated safety check: Pass | Custom licence | |
| Web Style ExtractorLucent-Snow/style-extractor | 453 | — | ~3.8k | Automated safety check: Pass | None | |
| Liuguang Banlan UIsickn33/agentic-awesome-skills | 47k | 1 repos | ~2.5k | Automated safety check: Pass | MIT | |
| Tailwind Design SystemSuFxGIT/scoutarr | 114 | 5 repos | ~5.6k | Automated safety check: Pass | None |
coollabsio/coolify
A skill your agent uses for Laravel MCP development. An agent skill from coollabsio/coolify.
Jakubantalik/transitions.dev
Audits existing UI animations against the transitions.dev motion-token scale and suggests tokens for duration, distance, scale, blur and easing.
Lucent-Snow/style-extractor
Extracts evidence-backed style guides and motion appendices from websites, keeping reusable visual language and stripping product-specific content.
sickn33/agentic-awesome-skills
Implements an interface in one of two named color modes, iridescent white or colorful black, from a parameterized starter that reports measured color intensity.
SuFxGIT/scoutarr
Build scalable design systems with Tailwind CSS v4, design tokens, component libraries, and responsive patterns.
Manavarya09/design-extract
Extract the full design language from any website URL. An agent skill from Manavarya09/design-extract.
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.
Categories
The SCSS workflow and its traps — where styling actually compiles, custom-variables.scss, themesource directories, hot reload, design-property errors, and the mxcli theme commands (apply, create…. Theme Styling is an agent skill from mendixlabs/mxcli.scss, themesource directories, hot reload, design-property errors, and the mxcli theme commands (apply, create --from a design, switchable sets, light/dark).
Theme Styling fits situations like: building a theme; giving an app a brand palette; styling silently fails to appear.
Run `npx skills add mendixlabs/mxcli --skill theme-styling -a claude-code`. Or copy the skill folder (.claude/skills/mendix/theme-styling in mendixlabs/mxcli) into .claude/skills/theme-styling in your project. Claude Code loads it when a task matches its description.
Run `npx skills add mendixlabs/mxcli --skill theme-styling -a codex`. Or copy the skill folder (.claude/skills/mendix/theme-styling in mendixlabs/mxcli) into .agents/skills/theme-styling 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 theme-styling -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/theme-styling, .gemini/skills/theme-styling, .github/skills/theme-styling and .opencode/skills/theme-styling in your project.
Going by SKILL.md and its folder, Theme Styling needs the command-line tools its instructions call (docker). Our summary lists: Docker.
SKILL.md contains no URLs. Its commands use docker, which can reach the network depending on how they are called. 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.
Theme Styling 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.5k tokens (SKILL.md is roughly 22k 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 Theme Styling: MCP Development (coollabsio/coolify, 63k stars), Transitions Polish (Jakubantalik/transitions.dev, 4.6k stars), Web Style Extractor (Lucent-Snow/style-extractor, 453 stars) and Liuguang Banlan UI (sickn33/agentic-awesome-skills, 47k 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.