Thanks for your interest in contributing to Silex! This guide covers code contributions. For other ways to help (templates, documentation, testing, tutorials, financial support), see the full contribute page.
Please talk to us before you start writing code. This avoids duplicate work, ensures your approach fits the project direction, and saves everyone time.
Pick whichever channel suits you:
- Community forum — best for feature proposals and design discussions
- Community chat — good for quick questions and real-time feedback
- GitHub Issues — best for bug reports and targeted fixes
Describe what you want to change and why. Wait for feedback from a maintainer before opening a pull request.
- Fork and clone the repository (with submodules):
For the Rust side:
git clone --recurse-submodules https://github.com/<your-username>/Silex.git cd Silex nvm install # optional — uses the version from .nvmrc pnpm install # install dependencies pnpm build # build the editor + server pnpm start # start the editor at http://localhost:6805
cargo check(orcargo build) at the repo root buildsserver-rust/anddesktop/. - Create a branch for your changes (
feat/...orfix/...).
New to the project? Look for issues labeled good first issue.
This is a monorepo. The Silex app itself is a single package (one package.json, one build) — the editor, server and common code are not split into separate packages. The code is split by role:
| Folder | What it is |
|---|---|
editor/ |
the GrapesJS-based visual editor (browser); built with webpack |
server/ |
the Node.js server, storage/hosting connectors and server/deploy/ (SaaS / CapRover) |
common/ |
shared contracts and types, plus the plugin-config system |
grapesjs-plugins/ |
the first-party GrapesJS plugins — independently publishable packages (see Workspaces below) whose source the editor build compiles directly |
server-rust/ |
the Rust server library |
desktop/ |
the Tauri desktop app (embeds server-rust/ + the editor frontend) |
silex-dashboard/, silex-dashboard-2026/ |
the multi-site SaaS dashboards — git submodules (see Submodules below) |
Cross-folder imports use path aliases (~/common, ~/editor, ~/server) — no ../../. The first-party plugins are imported by package name (@silexlabs/grapesjs-*), resolved to their source via webpack aliases (see Workspaces below). The Rust crates (server-rust/, desktop/) form a separate Cargo workspace.
Issues and pull requests all live in this single repository. A single branch can change several areas at once (e.g. the editor and one of its plugins).
We use a pnpm workspace (pnpm-workspace.yaml) only for the plugins under grapesjs-plugins/* — to install, lint, test and publish them as independent packages. Two things to understand:
- The Silex app build does not use the workspace. The editor compiles each plugin's source directly, resolved through webpack aliases + tsconfig
paths(seewebpack.config.js) — not throughnode_moduleslinking. So building/running Silex never depends on the plugins being installed as packages. The app's own install stays lean (pnpm install --filter @silexlabs/silex, as inDockerfile). - The plugins are versioned and released independently. We deliberately do not use the
workspace:protocol between them — a Silex release does not force a plugin release, and vice-versa. The only exception is@silexlabs/expression-input, a small internal lib used bygrapesjs-advanced-selectorandgrapesjs-data-source: it is linked locally ("@silexlabs/expression-input": "workspace:*") so those plugins always build and test against its current source.
Per-plugin tasks (each plugin keeps its own package.json, build, lint and test):
pnpm test:plugins # run each plugin's own test
pnpm lint:plugins # run each plugin's own lint
pnpm build:plugins # build each plugin (for publishing)
# or target one: pnpm --filter @silexlabs/grapesjs-symbols run testThe plugins come from separate repos and still have heterogeneous toolchains (some scripts call
yarn, some useweb-test-runner). Normalizing them to pnpm and getting every plugin green is ongoing — contributions welcome.
silex-dashboard/ and silex-dashboard-2026/ are git submodules — they are content (multi-site dashboards built with Silex), not core code, so they live in their own repos and are pinned here. Clone with submodules:
git clone --recurse-submodules https://github.com/silexlabs/Silex.git
# already cloned? pull them in with:
git submodule update --init --recursiveThe SaaS server serves the pre-built dashboard from silex-dashboard/_site (see server/deploy/server-plugins/dashboard.js). You don't need the submodules to develop the editor — only to run the full multi-site SaaS.
-
Reference the issue or discussion where your change was agreed upon.
-
Keep pull requests focused — one feature or fix per PR.
-
Test before opening the PR, and include a screenshot of that test in the description.
-
Run the checks that match what you changed (CI runs all of them on the PR):
- App (
editor/,server/,common/):pnpm build,pnpm lint,pnpm test. - A plugin (
grapesjs-plugins/*):pnpm build:plugins,pnpm lint:plugins,pnpm test:plugins— or scope to one:pnpm --filter @silexlabs/grapesjs-<name> run test. - Rust (
server-rust/,desktop/):cargo check -p silex-serverandcargo test -p silex-server.
There is no pre-commit hook — CI on the PR is the gate, so run the relevant checks yourself before pushing.
- App (
-
The PR is squash-merged, so its title must follow Conventional Commits (
type(scope): description) — it becomes the changelog entry.
We use a trunk-based model: main is the single, always-releasable branch.
mainis protected — no direct pushes. All work lands via PR.- Use short-lived branches (
feat/...,fix/...) and open a PR againstmain. - PRs are squash-merged; the squash title must follow Conventional Commits (
type(scope): description), since it drives the changelog. - Nothing auto-deploys from
main. Deployments and releases are driven by git tags, so untestedmainnever reaches production. Server (web) and desktop ship together from the same tag.
Two kinds of tags:
- Prerelease tags (e.g.
v3.9.0-canary.1,-alpha,-beta) — deploy to canary (canary.silex.me) for testing, publish a GitHub prerelease of the desktop apps, publish the versionedsilexlabs/silex-platformDocker image (also tagged:canary, never:latest), and publish@silexlabs/silexto npm under thecanarydist-tag. Nothing reaches production, and prerelease builds are never offered to stable users by the auto-updater. - Stable tags (e.g.
v3.9.0) — deploy the server to CapRover production (v3.silex.me), publish thesilexlabs/silex-platformDocker image (versioned +:latest), publish@silexlabs/silexto npm aslatest, and publish the stable desktop release (macOS/Windows/Linux) with auto-updater metadata.
In both cases the desktop GitHub release is created as a draft — a maintainer reviews and publishes it (the SaaS/Docker deploys are immediate). To test a build, cut a prerelease tag (it lands on canary); to release, cut a stable tag once canary is validated. Releases are cut by maintainers by tagging main.
To patch a release without shipping everything currently on main:
- Branch from the last stable tag:
git checkout -b hotfix/v3.8.1 v3.8.0 - Apply the fix and tag the patch (
v3.8.1) — the tag triggers the deploy. - Forward-port the same fix to
mainso it isn't lost in the next release.
A maintenance branch (e.g. v3-maintenance) is created on demand only when an older line must be supported while main moves ahead.
- Use BEM class naming for CSS
- Style via GrapesJS CssComposer — no inline styles
- Use Flexbox for layout (not CSS Grid)
- Internal links must be relative and start with
./
If your change can work as a plugin rather than a core modification, that's preferred. See Creating plugins for how to build and publish Silex plugins.
- Community chat
- Community forum
- GitHub Issues
- Roadmap — see what's planned and vote on features