evil wiki
Welcome to the long-form documentation for evil, the evil compositor.
This wiki is the place for the slow, detailed explanations that would be too large or too noisy for the repository README.
If you are here because you want to learn how evil works or how to write your own config, this is the right place.
Quick reference
- Lua API cheat sheet — every function, one line
- Hook payload summary — every hook's context fields
- Feature and support matrix — what works where
- Contributor validation matrix — what to run after what change
What evil is
evil is an experimental Wayland compositor built around a shared infinite canvas.
That means:
- windows live in world coordinates
- outputs act like cameras looking into that world
- the user experience is heavily shaped by Lua policy
The most important idea in the whole project is:
- Rust provides facts
- Lua provides policy
Rust owns runtime truth, rendering, validation, and protocol integration. Lua decides what the desktop should actually do with those facts.
That is why the wiki spends so much time on configs, hooks, and example policies.
Start here
If you are new, read these pages in order:
- Getting started
- Writing your first config
- Lua basics for evil users
- Lua API guide
- Hooks guide
- Example configs overview
That path will take you from:
- “what is this project?”
- to
- “I can read the example configs and start changing them myself.”
If your main goal is writing a config
Read this page first:
That page explains, in detail:
- how a config is usually structured
- what each section does
- why the code is written that way
- how to use helper functions
- how to add binds and hooks
- how to grow a config slowly without getting lost
Then use these:
If you want to learn by editing examples
Start here:
Then read whichever example matches what you want:
If you want to understand the project itself
Read these pages:
- Architecture and philosophy
- Queries, commands, and actions
- Drawing and visuals
- Feature status and limitations
- Feature and support matrix
These explain how evil is structured and what is already real today.
If you are contributing or debugging
Read these pages:
- Testing and debugging
- Contributor validation matrix
- Feature status and limitations
- Recipes
- Lua API cheat sheet
- Hook payload summary
These are useful if you are:
- changing code
- testing a new config idea
- trying to understand what is fully supported vs still narrow
Current project reality
Today, evil is best understood as three things at once:
- a pure core library (the evil core library) for geometry, focus, placement, rules, outputs, and bindings
- a deterministic headless runtime for policy development and testing
- a real live compositor with a practical nested
winitpath and an early standaloneudev/ tty path
It is already useful for:
- experimenting with scripted desktop behavior
- iterating on focus, movement, resize, placement, and drawing policy in Lua
- building custom workflows against both a headless runtime and a real live compositor
- learning from several real example configs with detailed walkthroughs in this wiki
Feature overview
| Area | Current picture |
|---|---|
| Core canvas / window / output logic | strong foundation |
| Headless runtime | practical and heavily testable |
Nested winit compositor |
the main live path and a good place to actually use and iterate on configs |
| Lua config + hook surface | real, useful, and expanding |
| Example configs | several serious starting points, including tiling and tty-focused profiles |
| TTY / standalone backend | real and usable, but still the least settled path |
| Desktop / protocol coverage | several important slices are real already, with broader coverage still growing |
| Documentation | wiki-first, with detailed guides for config writing, API use, examples, and debugging |
The biggest areas still evolving are:
- standalone tty confidence and recovery behavior
- broader desktop / protocol coverage beyond the current proven slices
- long-term Lua API stabilization and cleanup
Related repo docs
The wiki is the long-form home, but the repository still has useful shorter docs:
README.md— short project front pageCONTRIBUTING.md— contributor workflow and expectationstests/testing.md— practical testing guidedocs/llms.md— dense status / maintainer contextdocs/dev/plan.md— implementation plan
evil wiki
- Home
- Getting started
- Architecture and philosophy
- Configuration guide
- Writing your first config
- Lua basics for evil users
- Lua API guide
- Lua API cheat sheet
- Hooks guide
- Hook payload summary
- Queries, commands, and actions
- Drawing and visuals
- Example configs overview
- Example shared helpers and rules
- IPC protocol
- Testing and debugging
- Contributor validation matrix
- Feature status and limitations
- Feature and support matrix
- Recipes