A Lenovo Legion Go running Hyprland as a desktop, driven entirely by its controller. No Game Mode and no Plasma: a compositor, a bar, a menu, an on-screen keyboard, panels and a guide, every one of them reachable with two thumbs.
Two things hold it up. desktop.conf is the whole inventory -- packages,
files, services, masked units -- and console apply is the only thing that
installs any of it, so a restart cannot lose a fix nobody wrote down. And the
controller is emulated from a capture of the real one, so what a button does
can be tried on a laptop in a second rather than over ssh.
console check / apply / save where the machine has drifted, put it back,
take a file edited in place back into source
just test / desktop / checks here, nested at the device's own size, and
every feature it has grown
just deploy push it to the device and apply it
desktop.conf the whole inventory
files/ the content of every file it names, at the same path
crates/ every program on the device, in one workspace
docs/ why each thing is the way it is
migrations/ what a machine is told when the manifest stops naming something
scenarios/ presses a person would make, replayed
theme/ palette.toml, the one place a colour is chosen
tools/ the lint suite, and what a deploy runs
button-contract.md-- what the buttons promiseconsole-ui.md-- what a surface on this machine ispanels.md-- how a panel is builtprograms.md-- how a program is builtchecks.md-- one check to a featureflows.md-- the long way round, across featuresemulator.md-- the controller, in softwaredesktop.md-- the desktop on a machine that is not the devicedeploy.md-- what a deploy ismigrations.md-- what the manifest cannot saytheme.md-- the palette, and the one place it is chosenscreen.md-- size, brightness, and being left alonesky.md-- the wallpapersfiles.md-- the file browserdownloads.md-- getting something off the netbrowser.md-- the pad, in a pagevoice.md-- dictationnotifications.md-- what the desktop has saidrename.md-- why nothing here is called legionforks.md-- the two programs not in this repositorypictures/-- the menu, the panels, the keyboard, the guide
console-applications-- the menuconsole-browser-extension-- the add-on this desktop puts in its browserconsole-button-guide-- what every button doesconsole-core-atomic-writes-- writing a file so a machine that stops has a whole oneconsole-core-colour-- colours, and how far apart two of them areconsole-core-external-programs-- every program this desktop runs and did not writeconsole-core-localization-- everything a person reads, in the language they readconsole-core-never-- the error of a function that cannot failconsole-core-number-conversion-- the one place a number changes widthconsole-core-reconnect-- reaching again for something that has goneconsole-cpu-boost-- the processors, asked to hurry while somebody waitsconsole-default-applications-- what this desktop opens things withconsole-device-- the handheld, reached from this checkoutconsole-downloads-- something off the net, into the folders this device plays out ofconsole-events-- one subscription per source, and everybody else is toldconsole-files-- the files, as something the front of the machine can walkconsole-home-screen-- what is on the wallpaper, and where the thumb is on itconsole-input-controller-- input in, a doing out; it opens no deviceconsole-input-dictation-- speaking instead of typingconsole-input-focus-- input, claimed by whatever is in front of youconsole-input-gamepad-- a Legion Go you can press, on a machine that is not oneconsole-input-keyboard-- the on-screen keyboard, and the one crate with a licence of its ownconsole-input-mapping-- where the buttons are on a device that is not this oneconsole-input-pointer-- a pointer made of nothing, for the checks to press withconsole-input-touchscreen-- a finger put down at a place on the pictureconsole-launcher-- the program the menu isconsole-manifest-engine--console, the apply engineconsole-manifest-migrations-- what a machine has to be told, because the manifest cannot say itconsole-manifest-publish-- builds this copyconsole-media-viewer-- a photograph and a film, on the machine that holds themconsole-music-- the music: what it draws, what it lists, what it pressesconsole-music-player-- and what makes the sound: ffmpeg into pw-cat, answering on MPRISconsole-notifications-- what the desktop has said, kept where somebody can lookconsole-onscreen-- whether something is on the screen, asked of the compositorconsole-palette-- spends the palette into every file that holds a colourconsole-panel-- a panel: tabs across the top, and under them only what that tab is aboutconsole-panels-- one program, holding every panelconsole-program-contract-- what a program here is: words in, doings outconsole-program-lifetime-- how long a started program lives, said at the call siteconsole-program-runtime-- the loop that carries out what a program decidedconsole-repository-- where the repository is, from anywhere inside itconsole-response-times-- how long the machine kept somebody waitingconsole-screen-- the device's screen, read out of the compositor's own fileconsole-session-- which session has the screen, and how to get to the other oneconsole-settings-- what Legion right opensconsole-status-bar-- what the bar says about the machineconsole-test-checks-- the checks, one module to a featureconsole-test-desktop-- this desktop, in a window, on another machineconsole-test-flows-- the long way round, on purposeconsole-test-stages-- where a check can run, and what can be seen from thereconsole-wallpaper-- the sky: which wallpaper is up, and why
console-deploy-- put this checkout on the device and bring it to matchconsole-migrate-- move a device still called legion over to the console namesjust pull-- take what was changed on the device back into this checkoutcargo run --bin allow-uinput-- let this machine make input devices without being rootvoice-compare-- which hearing this device should use, measured on itexplicit-rust-- the dylint suite this workspace is written to, a workspace of its ownexplicit001_fallible_result-- a failure met is a failure saidexplicit002_infallible_result-- infallible fns returnResult<T, Never>explicit003_no_never_error--Result<T, !>is forbidden; the name isNeverexplicit004_no_panic-- nounwrap,expect,panic,todo,unreachableexplicit005_handle_fallible-- fallible values are handled or propagatedexplicit006_option_not_error--Optionis for "may not exist", not for errorsexplicit007_no_bool_return-- noboolreturn valuesexplicit008_no_bool_param-- noboolparametersexplicit009_explicit_discard-- a discarded#[must_use]islet _ =explicit010_no_numeric_into-- no implicit numeric coercionexplicit011_no_as_cast-- noascastsexplicit012_safety_doc--unsafecarries a// SAFETY:reasonexplicit013_breathing_room-- a block that decides something gets a blank line around itexplicit014_no_index_slice-- no indexing or slicing; ask withgetexplicit015_no_bare_arithmetic-- no bare integer arithmetic; the policy has a nameexplicit016_no_wildcard_arm-- no wildcard arm over an enumexplicit017_question_mark_alone--?is the whole of a statement, never buriedexplicit018_allow_with_reason-- anallowcarries its reasonexplicit019_no_if-- noif; a decision is amatchthat names both outcomesexplicit020_no_comment-- no comments; a//!head and a// SAFETY:stay
AGPL-3.0-or-later, for everything in this repository but one crate. Take it, change it, run it, sell it -- and whoever you hand it to, over a wire as much as on a disk, gets the source of what you handed them under the same terms. That is the whole reason for the choice: what is open here stays open downstream, and a desktop somebody serves rather than ships is not a hole in that.
The exception is
crates/console-input-keyboard, which is
GPL-3.0-or-later. It is a port of wvkbd and
carries the licence it was given; the AGPL is not a later version of the GPL, so
it was never ours to move. Its own module comment says so.
The two forks named in docs/forks.md are not here and keep
their own.