A controller-first Windows gaming console that still has a desktop when you need one.

English · Português

Install · Options · What it changes · How it works · Quick Settings · Media · Uninstall · Architecture

consolize turns a dedicated Windows 11 PC into a couch gaming console. It boots straight into Steam Big Picture or Playnite Fullscreen, recovers when the frontend crashes, and keeps the Windows desktop one controller-friendly action away.

Think SteamOS Game Mode, for the games and hardware that need Windows.

irm https://get-consolize.cybx.dev | iex

The guided installer elevates itself, asks what you want once, provisions the machine, creates a dedicated console account and carries the setup across the required reboots.

[!WARNING] This is for a machine you are willing to dedicate to it, not your daily driver and not a work PC.

The shell is only replaced for a second account it creates, so the account you use now keeps its normal desktop. But the setup also changes the machine as a whole: Defender, UAC, the firewall, the power plan and the boot screen. Setup asks about each of those and "leave it alone" is always one of the answers, and uninstall-console.ps1 puts them back, but you should know that before running the line above, not after.

The full list, with what each one costs and the script that reverses it, is in what it changes on your machine.

Use a spare drive or a VM if you have one. If you do not, take a system image first. That advice applies to any project that replaces the Windows shell, this one included.

What you get

Console boot Automatic sign-in directly to Steam Big Picture or Playnite Fullscreen, with no desktop flash
Self-healing frontend A watchdog restarts a crashed frontend and falls back to the desktop instead of leaving a black screen
Desktop on demand Enter from the Steam library; return through the tray icon or desktop shortcut; reboot always returns to console mode
Gamepad Quick Settings Audio output and volume, Bluetooth pairing, controller wake, wifi and power controls
Console-style Windows Quiet notifications, controlled updates, silent boot, gaming runtimes, power tuning and optional startup cleanup
SteaMidra integration Optionally installs the latest upstream Windows build and adds it to Steam automatically
Safe way back A separate administrator keeps its ordinary desktop; rescue and uninstall scripts restore the Windows experience

What the installer asks you

One interview, then it runs unattended across the reboots. Every answer has a default, so Enter all the way through is a working console.

Options Default
Console account name and password any name; the password is never left blank gamer
Steam language, keyboard layout any Steam language; layout is asked separately and never guessed from the language english, current layout
Launchers Steam, Playnite, Hydra, or all Steam
Which one boots steam / playnite / hydra steam
Windows updates everything / security only / skip everything
Software runtimes, GPU app, media players, Java, Git and 7-Zip, qBittorrent the recommended set
Media centre Kodi, Jellyfin, Plex, Stremio, and streaming sites kodi, jellyfin
Defender tune / disable entirely / leave alone tune
Power button sleep / hibernate sleep
Elevation quiet / off / prompt quiet
Firewall quiet / off / leave alone quiet
Remote maintenance SSH + Remote Desktop (home network only) / off on

The only step that needs you afterwards is signing in to Steam, inside the console account, because Windows keeps that login per user and no administrator can do it on another account's behalf.

What it changes on your machine

This replaces the Windows shell for one account and changes machine-wide settings, some of which reduce security. All of it is listed here rather than discovered later, and all of it is reversible with uninstall-console.ps1.

The shell and the session

Change Why Undo
The console account's Winlogon\Shell becomes consolize.exe that account boots into the frontend instead of Explorer disable-shell-launcher.ps1
Autologon, password stored as an LSA secret a console does not ask who you are set-autologon.ps1 -Remove
Windows logo, boot animation, error screens and boot menu timeout off a console does not show you Windows on the way up boot-silent.ps1 -Restore
Sign-in screen hidden (only at the very end of a successful setup) so a failure never hides the way back in rescue.ps1

Quiet

Change Why Undo
Game Bar and Game DVR off, machine and user the guide button belongs to Steam quiet-machine.ps1 -Restore
Notification toasts, tips, "finish setting up your device" off nothing pops over a game quiet-user.ps1 -Restore
Lock screen, screen saver and startup sound off a console never interrupts what is on screen same
Windows Update: installs at 04:00, never reboots under a session it will not restart mid-film quiet-machine.ps1 -Restore
Touch keyboard auto-opens on text fields there is no keyboard on the sofa quiet-user.ps1 -Restore
Desktop background becomes the console splash the default picture breaks the illusion same, though the old picture is not recorded
Startup items removed (Run, RunOnce, Startup folders, logon tasks) optional, backed up first, Windows' own entries untouched clean-startup.ps1 -Restore

Performance and power

Change Why Undo
Hardware-accelerated GPU scheduling on, MMCSS tuned for games measurable, and reversible tune-performance.ps1 -Restore
Reserved storage off (about 7 GB back) space on a console SSD same
-Aggressive also disables Search, SysMain and DiagTrack opt-in only same
Power button sleeps or hibernates, no password on wake, no core parking, screen never blanked a television handles blanking; blanking drops HDMI power-console.ps1 -Restore, which records the previous scheme first

It deliberately does not do the things most "optimisation" scripts do: bcdedit useplatformclock, disabling the pagefile, forcing timer resolution, Nagle edits, blanket debloat, disabling SSD defrag scheduling. Each of those either does nothing or causes the stutter it claims to fix, and the script says so on screen.

Security, and this is the part to read twice

Change What you lose Undo
Defender: game folders excluded, scans only when idle very little tune-defender.ps1 -Restore
Defender disabled entirely, if you choose it real-time protection, and it needs you to switch off Tamper Protection by hand same
UAC quiet: administrators elevate without a prompt anything running as the console account can gain administrator rights without asking you console-elevation.ps1 -Restore
UAC off: EnableLUA = 0 the above, plus everything runs elevated from the start, integrity levels included same
Firewall: inbound allowed on the private profile, notifications off games stop asking, and so does Windows firewall-console.ps1 -Restore
SSH and Remote Desktop on, if you say yes, scoped to the Domain/Private firewall profiles two remote doors into the machine, opened by its existing accounts and passwords remote-console.ps1 -Restore

Reasonable for one person's console in a living room. Not for a machine other people use, and not for the only account of a work machine. Leaving Windows alone is one of the answers to every one of these questions.

Before you install

This project replaces the Windows shell for one dedicated account and makes machine-wide system changes. Use it on a gaming PC, handheld or test VM, not on the only account of a work machine. Keep a second administrator account as the recovery path.

Windows 11 IoT Enterprise LTSC 2024 is the primary tested target. Home, Pro, Education and regular Enterprise can use the default registry shell method; some optional provisioning features vary by edition. A keyboard is still useful for the initial Windows and Steam sign-ins, even though everyday operation is designed for a controller.

Why not just use SteamOS or Bazzite?

They are excellent, and if everything you play runs under Proton you should probably use them: they do all of this natively and need no project like this one to behave. Three reasons someone ends up here anyway.

Anticheat. The hard blocker, and the one no amount of tuning fixes. Valorant, Fortnite, Destiny 2, most EA titles: kernel anticheat does not run on Linux, and the games are not "slow" there, they simply refuse to start.

Performance on current AMD hardware. The old assumption that Linux matches or beats Windows does not hold on RDNA 4 today. Aggregated testing on an RX 9070 XT puts Bazzite at 92% of Windows (127.9 against 138.6 FPS average), with CachyOS at 94%.

Be careful with that number, though. It is an average, and per title the picture is genuinely mixed: on a 7900 XTX at 4K, SteamOS wins Cyberpunk 2077 and Spider-Man 2 while Windows takes Forza Horizon 5 by a mile. GamersNexus, who ran the widest RDNA 4 set, refuses to cross-compare their own numbers across the two operating systems at all, and flags compatibility issues, crashes and shader compilation stalls as the thing that actually shapes the experience. So: a real edge on average with new AMD silicon, not a rout.

Newest hardware, day one. A GPU launches with a Windows driver. Linux support arrives when the kernel and Mesa catch up, which is exactly the gap RDNA 4 spent most of its first year in.

What you give up, honestly

Suspend and resume, with a caveat that matters. The problem is not sleep as such: on hardware that exposes real S3, sleep works fine and it is what power-console.ps1 defaults to. The pain is Modern Standby (S0ix), which is most new laptops and handhelds, where Windows drops into it unreliably and wakes for reasons nobody asked for. On a Steam Deck, where S3 is firmware driven, Windows is not meaningfully worse than SteamOS here.

Hibernate is offered for the machines where sleep is not trustworthy, and it is worth being honest about what it costs. It is not a shutdown: RAM is serialised to disk and process state comes back. But device and network state do not. A game can hit a lost D3D device on resume, an online session was dropped by the server long ago, and some anticheat modules dislike the gap. So hibernate is the option that survives a power cut, not the one that returns you to the middle of a match.

And you need this project at all, whereas SteamOS ships a console experience out of the box.

Why Windows 11 IoT Enterprise LTSC?

Any edition works. LTSC is what this is developed and tested against, because it ships lean (no Widgets, Copilot, Teams or Store apps) and only receives quality updates, so no feature update will ever break your living room.

Getting hold of it

Worth saying plainly, because it is the first wall people hit: IoT Enterprise LTSC is not sold at retail. There is no boxed copy and no store page. It is licensed per device through Microsoft's authorised IoT distributors (Arrow, Avnet, Advantech and similar) or through volume licensing.

Two honest routes:

  • Trying it: Microsoft publishes a free 90-day evaluation of Windows 11 IoT Enterprise LTSC. That is enough to build the machine, run consolize and decide whether the whole idea is for you.
  • Keeping it: an authorised IoT distributor for a single device licence, or volume licensing if you already have an agreement.

If you obtain an ISO from any third party, compare its SHA-256 with Microsoft's published hash list before booting it. Consolize does not endorse modified images or unauthorised activation; the evaluation above is the safe way to test before buying a licence.

And the part that saves most people the trouble: you do not need LTSC. The default shell method is a per-user registry value that works on Home and Pro just as well. What LTSC buys you is a leaner install and no feature updates, not a working console. If you already have Windows 11 on the machine, use it.

How the shell is replaced

Two mechanisms, and the default is the one that keeps desktop mode working:

-Method registry (default) -Method shelllauncher
What it does Sets Winlogon's per-user Shell value in that account's hive The Shell Launcher feature (WESL_UserSetting)
Editions all, Home and Pro included Enterprise, Education, IoT Enterprise
Restart on exit Winlogon's AutoRestartShell built in, with per-return-code actions
Desktop mode works: no shell is registered, so launching explorer.exe makes it take over, taskbar and all does not: Microsoft states that explorer there opens a folder window, not a desktop

consolize is its own watchdog and never exits on purpose, so Shell Launcher's restart handling is worth less to it than being able to reach the desktop. The session manager checks for the taskbar after starting explorer and says so in the log when it does not appear, rather than leaving you looking at a folder.

How it works

consolize.exe is a small .NET session manager that is the shell for a dedicated gamer account:

  1. It launches the configured frontend (Steam Big Picture by default; Playnite Fullscreen, Hydra or any executable via config).
  2. It watches the frontend and relaunches it if it crashes, with a crash-loop breaker that falls back to the desktop instead of flapping forever.
  3. "Desktop mode" is on demand, the way SteamOS does it, and reachable without a keyboard:
    • console to desktop: a "Desktop Mode" entry sits in the Steam library, added automatically during setup. Pick it with the controller and Explorer starts.
    • desktop to console: the session manager shows a tray icon while the desktop is up (double-click it), and setup also drops a "Back to Console Mode" shortcut on the desktop.
    • a reboot always comes back to the console, so a session left in desktop mode is never a trap.
  4. It exposes a named pipe (ping, status, desktop, console, restart, sleep, panel, quit) so scripts and future tooling can drive the session.

Quick Settings

consolize panel opens a fullscreen panel built for a gamepad: d-pad or left stick to move, A to select, B to close, LB and RB to change page. It is added to the Steam library during setup, so it is reachable from the couch.

Page What it does
Audio Switch output device (TV, headset, receiver) and set volume
Bluetooth Scan, pair and forget devices without the Settings app
Controllers How many pads are connected, and which devices may wake the machine
Network Connect to a saved wifi network
Power Back to console, desktop mode, restart frontend, sleep, restart, shut down

The Controllers page covers the setting that decides whether a button on the pad turns the console back on. It used to live in Device Manager, which is precisely where a controller cannot go. Note it only applies to sleep: nothing on USB wakes a hibernated machine, so with -RestMode Hibernate it is the case button or an HDMI-CEC adapter.

consolize panel --diag prints what it can see (audio devices, Bluetooth radio, XInput availability) without opening a window, which is the quick way to check a machine.

The way out of anything: hold Start + Back

Steam's overlay is what normally gives a non-Steam entry a way back, and it does not hook Electron applications or a browser window. So inside YouTube, Kodi or a streaming site the guide button does nothing, a window with no decorations has nothing to close, and a sofa has no keyboard. Before this the only way out was the power button.

The session manager is the shell and is always running, so it is the only thing that can watch for a chord no matter what holds the foreground. Start and Back held together for a second opens Quick Settings over whatever is on screen, and its Power page goes back to the console.

It only reads XInput; it never injects or swallows input, so a game receives exactly the buttons it always did. The hold is what stops it firing mid-play, and PanelChordSeconds in config.json changes the delay or, at 0, switches it off.

What it is not: a scheduled task launching a VBS that launches a batch, or a chain of fixed 20-second sleeps hoping the frontend is up by then. The one registry value it does write is the per-user Winlogon\Shell above, which is the documented way to give an account a different shell, and disable-shell-launcher.ps1 takes it back.

Status

Phase What Status
F1 Session manager (watchdog shell + desktop on demand) shipped
F2 Quiet layer (Game Bar off, DND, update discipline, autologon via LSA, boot UI) shipped, and reversible with -Restore
F3 Power: rest mode (sleep/hibernate profile, wake by controller, no core parking) shipped; -Restore records the previous scheme before changing it
F4 Controller-first quick settings (Bluetooth pairing, audio output, volume, wifi) without touching a desktop shipped
F0 Provisioning: gaming bootstrap (GPU driver, runtimes, updates) + autounattend.xml bootstrap shipped, autounattend pending
F5 Remote maintenance (OpenSSH, second admin account, clean uninstall) uninstall and rescue shipped; remote access still open
F6 Media: your own apps in the library, YouTube, and a media centre shipped

Verified on hardware so far: everything up to the shell replacement. Four things are still only proven in a VM or not at all, and they are listed honestly in docs/architecture.md rather than assumed here.

Install

On the machine that will become the console:

irm https://get-consolize.cybx.dev | iex

No need to open PowerShell as administrator: it asks for elevation itself and continues in the elevated window. Setup disables QuickEdit, so clicking inside that window does not silently pause the installer.

That address is a Cloudflare Worker in front of this repository, reading through the GitHub contents API so a fix published a minute ago is the one that runs; raw.githubusercontent.com caches for minutes, which is long enough to run yesterday's code by accident. Its source is cloudflare/worker.js.

It installs consolize.exe plus every setup script, then runs the whole provisioning, asking before each part. You answer a short interview once; everything after that is automatic, including the reboot and the account switch it needs.

The setup scripts are copied to the machine at install time, so a fix published later does not reach it on its own. To pull the current ones without starting over:

& ([scriptblock]::Create((irm https://get-consolize.cybx.dev))) -UpdateOnly

From the console itself there is an Update consolize entry in the Steam library, which does the same thing plus winget upgrades and offers the restart.

What the console account is allowed to do

It installs and plays games, pairs Bluetooth devices, joins wifi and switches audio output without any of that needing elevation. One thing does: games with kernel anticheat (Fortnite, Apex, Rainbow Six) install a system service the first time they run.

That single case decides the account type, because Windows handles it in two unhelpful ways. A standard account is asked for an administrator's username and password, which cannot be typed with a gamepad. An administrator account is asked only Yes or No, but the prompt is drawn on the secure desktop, which ignores injected input by design, so Steam's mouse emulation cannot click it.

console-elevation.ps1 offers three answers, and all of them make the console account an administrator, without which none of them work:

what it does
quiet (default) UAC on, but administrators elevate without being asked. Nothing prompts, and programs still start unprivileged.
off UAC off entirely (EnableLUA = 0). Nothing prompts either, but everything runs elevated from the start, integrity levels included.
prompt UAC on and still asking, moved off the secure desktop so an emulated mouse can answer.

quiet is the default because it prompts exactly as never as off does, so the sofa experience is identical, while programs still start unprivileged. A game that goes wrong sits at medium integrity instead of having owned the machine since it launched, and the sandboxes in the browser and in packaged apps, which are built on integrity levels, keep working.

The trade, plainly: both quiet and off mean anything running as this account can gain administrator rights without you being asked. Reasonable for one person's console in a living room; not for a machine other people use. Setup asks, and leaving Windows alone is one of the answers.

(off used to break Store and packaged apps. That was fixed in Windows 10 build 15063, so it no longer applies here.)

Everything else is covered up front rather than at runtime: the runtimes step installs every VC++ generation, DirectX, .NET and the rest precisely so a game never has to install a prerequisite mid-launch.

Two accounts, and why

The account Windows was installed with keeps the normal desktop and stays your way back in. A second account (gamer by default) is the only one whose shell gets replaced.

The setup drives itself across that boundary, which it has to cross because Windows keeps the Steam login per user and no administrator can sign in on another account's behalf:

  1. Everything machine-wide runs from your answers, then the machine reboots.
  2. It logs into the console account by itself and a window finishes that account: per-user settings, then Steam, waiting for you to sign in with "Remember me" ticked. That is the one screen that needs you.
  3. A SYSTEM task notices the account is ready, preflights, replaces the shell and reboots into console mode.

On the first reboot, Windows may show the blue PowerShell window with no text briefly while powershell.exe cold-starts and the new user profile settles. No script can draw before that process is ready. As soon as phase 2 begins it now prints consolize: starting the first-logon setup... and keeps all subsequent work in that same window; it no longer closes it and relaunches another PowerShell that looks blank. QuickEdit is disabled directly in the live console through the Windows console API, as well as in the account's saved console settings, so an accidental click cannot freeze this phase either.

If the Steam sign-in never happens, step 3 refuses to replace the shell and says why: booting into a login window a controller cannot fill in would strand you. Cancel a setup in progress with .\setup-console.ps1 -Abort.

If you end up looking at a black screen, Ctrl+Shift+Esc opens Task Manager over any shell. File > Run new task, tick "Create this task with administrative privileges", and run:

powershell -ExecutionPolicy Bypass -File "C:\Program Files\Consolize\setup\rescue.ps1"

That gives back the logon screen, the desktop and the boot messages in one go, and cancels anything still scheduled. The logon screen is only hidden at the very end of a successful setup, precisely so a failure never hides the way back in.

Fixing it from another machine

The couch is the worst place to debug the couch machine. Say yes to remote maintenance and two doors open, both built into Windows, both answering only on the home network (firewall rules scoped to the Domain and Private profiles, never Public), both signed into with the accounts and passwords the machine already has. remote-console.ps1 opens them or closes them (-Restore) at any time, and the uninstaller closes both.

SSH is for commands: OpenSSH Server with PowerShell as the login shell, the way a Linux box does it. The session manager's pipe name carries a session id and an SSH logon gets a session of its own, so consolize send now looks for the console session's pipe when its own is not there:

ssh you@console
consolize send status
consolize send desktop     # the TV drops to the desktop, from your chair

One trap worth knowing: key sign-in for an administrator reads C:\ProgramData\ssh\administrators_authorized_keys, not ~\.ssh\authorized_keys. Passwords work with nothing extra.

Remote Desktop is for a screen, and there are two screens to ask for. Signing in as the admin account opens a separate session and leaves the television alone. Shadowing shows the session that is actually on the TV:

ssh you@console qwinsta                     # note the console session id
mstsc /v:console /shadow:<id> /control /noConsentPrompt

Signing in over RDP as the console account itself is the mistake: RDP takes the session with it and the television drops to a lock screen until tscon <id> /dest:console, run over SSH, hands it back.

Putting your own apps in the library

Steam can add a non-Steam game itself, but that takes a mouse and a file browser, and a machine that boots into Big Picture has neither. From a terminal in desktop mode:

cd 'C:\Program Files\Consolize\setup'
.\add-app-shortcut.ps1 -Name 'RetroArch' -Exe 'C:\RetroArch\retroarch.exe'
.\add-app-shortcut.ps1 -List

It gets cover art and lands in the Consolize collection with the rest. The list lives in C:\ProgramData\Consolize\shared\extra-shortcuts.json, so it is reapplied on every update rather than being a one-off.

All of that writes into Steam's library. Configured to boot into another frontend, add-console-shortcuts.ps1 now writes none of it and says so: entries would sit in a library the console never opens. The desktop shortcut is still made, the list is still kept — back on Steam one day, a single -Force run projects it all again — and -SteamAnyway overrides. Add the entries to the other frontend's own library by hand, starting with the way out: one that runs consolize.exe send desktop.

Taking an app off the list does not remove it from the library: an entry that no longer matches anything consolize knows about cannot be told apart from one you added by hand. To clear them all: add-console-shortcuts.ps1 -Remove -Force, then run it again without -Remove.

YouTube on the television

bootstrap-gaming.ps1 offers it, or on its own:

.\install-youtube.ps1

The obvious route does not work, which is worth knowing before you try it. YouTube's TV interface is a plain web app at youtube.com/tv, but Google blocks browsers from it unless they identify as a console or a TV, and the user-agent trick that gets past that gives you the interface without gamepad support: arrow keys work, the controller does nothing. Most recipes for this online predate the block.

So this installs VacuumTube, which wraps that same official interface in Electron, identifies as the YouTube TV app and implements controller input itself. MIT, actively maintained, not on winget, so its portable x64 archive comes from the upstream GitHub release, has its published SHA-256 digest verified, and is extracted machine-wide under C:\Program Files\VacuumTube. It gets a library entry like everything else.

Sign in with Settings > Link with TV code rather than typing a password on a television.

SteaMidra

The software interview offers SteaMidra as an optional integration. Consolize resolves its latest upstream GitHub release at install time, downloads the Windows ZIP, extracts it with 7-Zip to C:\Program Files\SteaMidra, and adds SteaMidra to Steam as a non-Steam app. That library entry goes through Windows' elevation broker because SteaMidra requires administrator rights. With the default quiet elevation mode it opens without a prompt; prompt shows a controller-friendly Yes/No dialog. Steam keeps the entry marked as running until SteaMidra closes. Run or update it on its own with:

.\install-steamidra.ps1

A media centre too

bootstrap-gaming.ps1 offers it, or on its own:

.\install-htpc.ps1
.\install-htpc.ps1 -Apps kodi,jellyfin -Services netflix,primevideo

Two kinds of thing, and they behave differently:

Players (Kodi, Jellyfin Media Player, Plex HTPC, Stremio) are real applications. Kodi reads a gamepad natively, so it is the one that actually feels like a console, and it has add-ons for Jellyfin and Plex if you would rather have one front door.

Streaming services (Netflix, Prime Video, Disney+, Max, Globoplay, Crunchyroll) have no native Windows application any more. Netflix's "app" in the Microsoft Store has been an Edge web app since 2024, so on LTSC, which has no Store, nothing is lost by opening the site in Edge directly with --app: a window with no tabs, no address bar and no back button over the film, each service on its own profile so they stay signed in separately.

Edge and not Chrome or Firefox, deliberately. Netflix serves 1080p and 4K only to browsers that can use PlayReady, which on Windows means Edge (Chrome gained it recently on Windows 11, Firefox is still capped at 720p). Getting 720p on a television because of the browser would be a strange way to lose.

The catch, said plainly: a web app does not read a gamepad. Set Steam's Settings > Controller > Desktop layout to one with right-stick mouse, and bind a chord to the on-screen keyboard for signing in. The native players do not need any of that.

Taking it back off

rescue.ps1 is for a setup that went wrong, and only undoes what can hide the screen. To remove consolize entirely:

powershell -ExecutionPolicy Bypass -File "C:\Program Files\Consolize\setup\uninstall-console.ps1"

Run that from an administrator PowerShell. The -ExecutionPolicy Bypass is not superstition: Windows refuses unsigned scripts by default, and reports it as "cannot be loaded because it is not digitally signed", which is a confusing thing to be told about a file in Program Files. The installer unblocks what it writes, so & '...\uninstall-console.ps1' works too on a machine set to RemoteSigned, but the line above works everywhere and is the one to use if the other is refused.

It puts the shell back first, so a failure in any later step still leaves a machine you can sign into, then restores Defender, the firewall, UAC, the power plan, startup and the quiet layers, and removes the scheduled tasks, the Steam library entries and the installed files. Add -WhatIfOnly to see the plan without doing it.

The console account is kept unless you pass -RemoveAccount, because it owns the Steam library, the saves and the screenshots. -RemoveAccount -DeleteProfile takes those too.

Anything already back to normal is skipped, so running it twice is safe. What it cannot recover is a setting that already had a non-default value before consolize ran: those were overwritten without being recorded, and the script says so rather than pretending otherwise.

Everything below is the manual/from-source path; each script also works alone.

Quick start (bench testing, no shell replacement)

You can try the session manager inside a normal desktop session first:

dotnet publish src/Consolize.SessionManager -c Release -r win-x64 -o out/publish
./out/publish/consolize.exe          # Steam Big Picture opens, watchdog active
Start-Process ./out/publish/consolize.exe -ArgumentList 'send status'  -NoNewWindow -Wait
Start-Process ./out/publish/consolize.exe -ArgumentList 'send desktop' -NoNewWindow -Wait
Start-Process ./out/publish/consolize.exe -ArgumentList 'send quit'    -NoNewWindow -Wait

Start-Process -Wait rather than a plain call on purpose: consolize.exe is a GUI subsystem binary, so being the shell never flashes a console window, and PowerShell does not wait for those. A plain consolize send status still prints, it just arrives after your prompt comes back and cannot be captured into a variable.

Config lives at %LOCALAPPDATA%\Consolize\config.json (created on first run, with %ProgramData%\Consolize\config.json as the machine-wide fallback), logs at %LOCALAPPDATA%\Consolize\logs\.

Coaxing a stubborn frontend: FrontendArgs replaces the built-in arguments. Big Picture is Chromium and wants a GPU, so on a machine without 3D acceleration (a plain Hyper-V VM, for instance) it hangs or renders black until you turn that off:

{ "Frontend": "steam", "FrontendArgs": "-cef-disable-gpu -bigpicture" }

Your own boot logo: drop a splash.png next to either config and the session manager shows it fullscreen while the frontend starts, closing the moment the frontend draws its first window. Since boot-silent.ps1 removes the Windows logo, this is what the machine shows on the way up.

Making it the real shell

Warning: you are replacing the Windows shell for a user. Do this on a dedicated gamer account, keep a second admin account with the default shell, and read the scripts before running them. Tested target: Windows 11 IoT Enterprise LTSC 2024.

# as admin, from the repo root, on the machine that will become the console
./setup/bootstrap-gaming.ps1              # updates, GPU driver, game runtimes, launchers, media players, tools; interactive with recommended defaults (installs winget itself if missing)
./setup/quiet-machine.ps1                 # nothing ever pops over a game, updates at 04:00, quiet boot
./setup/tune-defender.ps1                 # game folders excluded, idle-only scans (add -Disable to turn Defender off entirely)
./setup/tune-performance.ps1              # HAGS, MMCSS game profile, reserved storage (add -Aggressive to strip background services)
./setup/power-console.ps1                 # power button = rest mode, no password on wake, no core parking
./setup/clean-startup.ps1                 # nothing starts with Windows except the console itself (reversible)
./setup/boot-silent.ps1                   # no Windows logo, no welcome screen, no boot error dialogs

# log into Steam once with "Remember me" before the next step, then:
./setup/preflight.ps1 -UserName gamer     # catches the first-boot traps while a desktop is still there
./setup/set-autologon.ps1 -UserName gamer # autologon with the password stored as an LSA secret (never plaintext)
./setup/install.ps1                       # builds and installs consolize.exe
./setup/enable-shell-launcher.ps1 -UserName gamer

# once, inside the gamer session (no admin):
./setup/quiet-user.ps1                    # guide button goes to Steam, toasts off, tips off

# optional, any time after setup:
./setup/add-app-shortcut.ps1 -Name 'RetroArch' -Exe 'C:\RetroArch\retroarch.exe'
./setup/install-youtube.ps1                # YouTube's TV interface, gamepad driven
./setup/install-htpc.ps1                   # Kodi, Jellyfin, Plex, and the streaming sites

# undo, all of it at once:
./setup/uninstall-console.ps1              # add -WhatIfOnly to see the plan first

Each piece still undoes itself alone (disable-shell-launcher.ps1, set-autologon.ps1 -Remove, tune-defender.ps1 -Restore, and -Restore on the rest), which is what uninstall-console.ps1 calls in the order that keeps the machine signable-into at every step.

See docs/architecture.md for design decisions and the full roadmap.