Full-code apps
Full-code apps let you build custom frontends with React or Svelte that connect to Windmill backend runnables and data tables. Unlike the low-code app editor, you write your own components and have full control over the UI.
How it works
A full-code app is a directory with the .raw_app suffix (e.g. my_app.raw_app/) or the __raw_app suffix (e.g. my_app__raw_app/) depending on your sync settings. It contains:
- Frontend code: React or Svelte components bundled and served by Windmill
- Backend runnables: scripts in any supported language that run on Windmill workers
- Configuration: a
raw_app.yamlfile defining metadata, policy and data access
When deployed, Windmill bundles your frontend code and serves it as a single-page application. Your frontend calls backend runnables through an auto-generated wmill.ts module, which communicates with Windmill's execution engine via WebSocket.
Full-code vs low-code apps
| Full-code apps | Low-code apps | |
|---|---|---|
| UI | Custom React/Svelte components | Drag-and-drop component library |
| Frontend logic | Full framework features (hooks, stores, routing) | Connecting components + inline scripts |
| Backend | Scripts in backend/ folder, any language | Runnables panel, inline or workspace scripts |
| Styling | Your own CSS, Tailwind, etc. | Component-level + global CSS editor |
| Local dev | wmill app dev with hot reload | Web-based editor only |
| Best for | Custom UIs, complex interactions, existing codebases | Quick dashboards, forms, CRUD interfaces |
Getting started
The fastest way to create a full-code app is with the CLI:
wmill app new
This scaffolds a project with your chosen framework (React or Svelte), a sample backend runnable, and the necessary configuration. Then start the development server:
cd f/folder/my_app.raw_app # or my_app__raw_app
wmill app dev .
See the CLI workflow page for the full setup guide.
Folder suffix
By default the CLI uses dotted suffixes (.raw_app). If your filesystem or tooling hides dotfiles, set nonDottedPaths: true in your wmill.yaml to use dunder suffixes (__raw_app) instead. All examples in this documentation use the default .raw_app suffix — substitute __raw_app if you enabled non-dotted paths.
Supported languages
Backend runnables support all Windmill script languages:
| Language | Extension | Language | Extension |
|---|---|---|---|
| TypeScript (Bun) | .bun.ts or .ts | Python | .py |
| TypeScript (Deno) | .deno.ts | Go | .go |
| PostgreSQL | .pg.sql | MySQL | .my.sql |
| BigQuery | .bq.sql | Snowflake | .sf.sql |
| MS SQL | .ms.sql | OracleDB | .odb.sql |
| DuckDB | .duckdb.sql | GraphQL | .gql |
| Bash | .sh | PowerShell | .ps1 |
| PHP | .php | Rust | .rs |
| C# | .cs | Java | .java |
| Ruby | .rb | Nu | .nu |
| Ansible | .playbook.yml |