If you’ve ever needed to install Fedora Linux on a headless server, a Raspberry Pi, or any machine without a monitor attached, you’ve probably reached for VNC or RDP. They work – but as the installer moves to a web-based interface, there’s a new opportunity to do something more native to that model. We’re building it, and we want your input before we go too far down a path that’s hard to reverse.
Why This Is Happening
The Anaconda installer’s Web UI first landed in Fedora Linux 42 Workstation and was extended to all Live spins in Fedora Linux 43. It’s a full graphical installer built on Cockpit tooling and using PatternFly widgets. The GUI is rendered in a fullscreen browser window – but until now, that browser had to be running on the same machine you’re installing onto.
Here’s the thing: VNC and RDP were built around the GTK interface. While RDP could technically work with the Web UI too (it operates at the display level), a remote browser is a much better fit – orders of magnitude less data and much lower UI latency. As the Web UI becomes the primary installer interface across Fedora Linux editions, it needs its own native remote access story.
On top of that, there are two more forces pushing in the same direction.
As browsers move toward Flatpak packaging – already the reality for atomic desktops and derivatives like Bazzite – remote installation opens an opportunity for shipping focused, smaller boot images that don’t need to bundle a local browser at all. A lightweight ISO aimed at headless and network install scenarios, where the assumption is that you’re connecting from another machine.
And once you have a browser-rendered installer, serving it to a remote browser is the natural next step anyway. A headless ARM SBC doesn’t need to run a GPU-accelerated browser locally just to show you a disk partitioning screen. Your laptop can do that for it.
What It Actually Is
The concept is pretty straightforward: Anaconda’s Web UI, already built on Cockpit, gets served over HTTPS. You point a browser at the machine you’re installing, authenticate with a PIN, and you’re controlling the installation remotely. No VNC client, no RDP client, no X forwarding. Just a browser.
If you’ve used Cockpit to manage a server, you already have a feel for the experience. The difference is that the machine you’re connecting to is mid-install, not running a full OS.
Use Cases
The ones we’ve talked through most:
Headless servers – You’re installing onto a server in a rack with no attached display. You expose the Web UI over the network and control everything from your workstation.
Lightweight ARM SBCs – Devices like Raspberry Pi have limited resources. With remote rendering, the Pi just runs the installer backend; all the UI rendering happens on whatever machine you’re connecting from.
Remote monitoring – Even if you’re not fully headless, being able to watch an installation from another machine is genuinely useful. Kick off a server install, go make coffee, check progress from your laptop.
The Design Decisions So Far
We’ve had some meaty discussions about how this should work, and a few things are now settled.
Authentication: You set a PIN through kickstart or boot options, and type it into the browser login page. Same pattern as VNC and RDP – the user provides the password, not the system.
TLS with self-signed certificates: The connection is encrypted, but the certificate is generated on the fly at boot. That means your browser will show the “this certificate isn’t trusted” warning. We’ve accepted this tradeoff – shipping a private key on installation media is a security risk, and the IP address isn’t known ahead of time, so standard PKI doesn’t really apply. For environments that need proper certificates (say, a university deploying at scale), Image Builder is likely the right path to embed custom certs. That’s a later problem.
Single connection only: Only one browser session can connect at a time. Two concurrent sessions could genuinely conflict – one session starting installation while another changes the storage configuration. So: one connection, full stop.
Reconnection behavior: If you disconnect and reconnect, what happens depends on where the installation was. Before the review screen – the point of no return – you start from step one. After the review screen (installation actually running), you land on the progress view. Simple two-state model, covers the critical cases.
Config isolation and port: All Cockpit configuration specific to remote installation lives in /etc/anaconda/cockpit/, not the default Cockpit paths – otherwise the config could leak into the installed system. We’re leaning toward port 443 by default so you can just point your browser at the machine’s IP without specifying a port, but the port will also be configurable.
How This Compares to VNC and RDP
VNC has been around in Anaconda for years; RDP support was added more recently. Both work by screen-sharing the GTK interface. Technically, RDP could work with the Web UI too – it operates at the display level, scraping pixels from the screen. But a remote browser is simply better: you send orders of magnitude less data and get much lower UI latency compared to streaming a full desktop.
Beyond performance, there are practical advantages. No client is required – any modern browser works. No VNC viewer to install, no RDP client to configure, no protocol quirks across platforms. And it’s the same Web UI we’re already actively developing, so features and fixes automatically benefit the remote experience. With VNC or RDP, you’re screen-sharing a separate GTK codebase – a separate maintenance burden.
VNC and RDP aren’t going away for now – they still work with the GTK legacy interface. But as the Web UI becomes the default across more Fedora Linux editions, browser-based remote access is where the investment goes.
Where We Are Right Now
This is a developer preview. Here’s what’s working:
- Custom login page with PIN-based authentication
- Separate socket-activated systemd unit for auth (clean separation from the main Cockpit process)
- Session cookies that survive tab closes, require re-login on browser close
- Cockpit config in an isolated, anaconda-owned path
Here’s what’s still open:
- Single-connection enforcement (this will likely require close collaboration with the Cockpit team)
- Backend detection of whether installation is already running (this is needed for proper reconnection behavior)
If you want to see the PoC in action, there’s a draft PR at rhinstaller/anaconda-webui#1274 with the authentication setup – custom login page, pin-based auth script, socket-activated systemd units, and the Cockpit config override. To try it yourself, clone the PR branch, build an updates image, and boot it with virt-install:
git clone -b poc-remote https://github.com/bruno-fs/anaconda-webui.git cd anaconda-webui make create-updates.img virt-install \ --name anaconda-remote-test \ --ram 4096 \ --vcpus 2 \ --disk size=20 \ --location /path/to/Fedora-Everything-netinst-x86_64-Rawhide.iso \ --extra-arg "inst.updates=http://your-host:port/updates.img" \ --extra-arg "inst.webui.remote"
This is a proof of concept, not production-ready code. The PIN is hardcoded to 1234, there’s no TLS, and single-connection enforcement isn’t in place yet. Don’t use this for real installations – it’s meant to show the direction and let you poke at the approach. Once the installer boots, point a browser at the VM’s IP and enter 1234 on the login page. It’s rough, but it runs.
What We Want to Hear From You
We’re sharing this now because some of these decisions are hard to unwind once the feature ships, and community input is more useful now than after the fact. A few things we’re genuinely thinking about:
Remote installation is opt-in – you enable it through boot options or kickstart. But here’s a question we’re genuinely considering: should we ship a lightweight boot ISO without a local browser, with remote installation enabled by default? A minimal image aimed at headless and network install scenarios, where the assumption is that you’re connecting from another machine. Would that be useful to you? And if you’re using VNC or RDP for remote installation today, would this replace them? What would it need to do that it doesn’t yet?
Come talk to us on Matrix (#anaconda:fedoraproject.org), or leave a comment on this article. You can also follow the work on the anaconda-webui GitHub repo. We’re looking forward to hearing from you.




I made also earlier a poc - feel free to digg and gather ideas from it.
Zoltan
How do we find the source code please?
There are links to github repos in the Fedora Magazine documents mentioned in this thread: https://github.com/bruno-fs.
Right, but my question was in reply to @zoltanh721 .
This could be very useful, but more so if it can work with tablets. Before retiring, I found it hard to find space for a laptop when visiting user cubicles or break rooms. At home, an ipad (with termius and cockpit) is often more useful than a laptop for quick checks on desktop system status.
TY! I will definitely explore it!
I almost suggested in the article phones could be used to control the installation, but I never personally tried that. Cockpit (and patternfly the underlying patternfly widgets) are responsive. I personally think only the storage configuration might be tricky.
A tablet might work just fine, though!
This specific PoC you can find in this PR: [do not merge] PoC for remote installation support by bruno-fs · Pull Request #1274 · rhinstaller/anaconda-webui · GitHub
oh, right! I’d love to see Zoltan’s source too.
Hmm, has Anaconda become so heavy that it requires two machines to run? One for web server, private dbus, web server to dbus bridge, python instances and the other one for web browser, javascript app?
It is an achievement to require 6 gb of memory for an installer which would probably work just fine in a terminal.
Maybe Anaconda should learn to fly and join the Hummingbird initiative?
Those 6 Gb come out of nowhere. The article does explain the reasons for remote installation quite well.
The ability to install the system over RDP and VNC existed for quite some time, and is used by many. Now WebUi allows us to significantly reduce the requirements for this use case, and have all the expected features (like copy-paste) work much easier than it is done with the remote desktop tools.
And of course the text mode, and kickstart installations for Anaconda, stay no matter the choices and features of the graphical UI.
You need to add much more context and details in your comment, if you’d like to turn this into a meaningful statement.
I installed Linux and FreeBSD to a RPi4 the past few days just writing the image to SD and booting it
(oS TW and FreeBSD had SSH post-boot)
Vultr VPS with custom ISO installs I think had VNC in their web interface; not sure the specifics, but it seemingly just remote controlled the machine as if I was in front of it (didn’t matter the OS; it displayed GRUB boot, TTY, and installers the same as if bare-metal)
It’s no secret that Anaconda runs sluggish in Fedora WS with the recommended 4 gb .
Going minimal. The opposite of this process tree:
The only thing this list of processes shows is that Anaconda devs did a good job in the last years on making the backend more modular, and systemd does good job in visualizing it.
So yes, instead of one process called “anaconda” you see components which are involved in the installation process. These components are not new, the fact that you see them listed as modules is new.
The main resource requirements on the installation process do not come from Anaconda. they come from two places:
The package installation which Anaconda needs to trigger. Package manager needs quite a lot of resources especially when it deals with large list of packages for the initial installation and not just a couple of updates as in regular post-install workflows.
Graphical environment. WebUI or GTK UI - there is no big difference here, it is the need to show the UI locally on the system which bumps the resource requirements as we need to run a whole desktop to be able to show a UI at all. We try to reduce this dependency by using GNOME Kiosk instead of full GNOME Shell, but it is still quite a lot.
Remote installation solves that second part. Unlike RDP and VNC approach to remote installation, which adds couple of layers of complexity on top of the full local installation environment, installation over web removes the unnecessary layers, the need to deal with things like passing complex shortcuts to the remote desktop, copy-paste, keyboard layout switch.., and makes the whole process simple.
Of course if the installer is running from a live desktop session, then the graphical components are provided by the desktop.
But for the non-live use case, could a slimmer Everything ISO be made which supports only text-mode (and kickstart) installation, so doesn’t have to bundle the graphical components?
I think this is the question where we would need a community input.
I recently tried to map various installation configurations which we have in Fedora, and got something like this.
So we have several classes of iso images: Live, Atomic, boot.iso and DVD.iso, but all of them have text mode, kickstart mode and the graphical mode included.
We don’t want to make even more iso images, but replacing some of the existing images with a “slim” remote-only version might be good.
But then which one?
Everything iso is by definition, everything
so I am not sure removing some feature from the Everything iso is aligned with its purpose.
But maybe we can do a remote-only Fedora Server?
Well - it’s meant to be able to install everything, by pulling it from the network
A purely text-mode installer could provide all the same functionality.
Remote-only would be interesting. But the use case I was thinking of was just “boot your desktop/laptop into the installer USB, and do a custom Fedora installation pulling packages from the internet”. It would be nice to have a smaller ISO that can do all that in text mode, without all the machinery to provide a browser-based GUI.
The Fedora WS live payload installs through rsync, not a package manager.
It’s the combination of GUI and web browser which causes the memory pressure. Remove one of them and there is enough memory left.
It doesn’t. Search Ask Fedora for wifi not working.
I was talking about boot.iso installations not Live.
For the Live image your target environment is the same as the installation environment. Trying to optimize the installation environment to use less resources doesn’t help here, because if you don’t have enough resources to run a DE and a browser on the target environment, there is no point installing it.
The boot.iso is used to install a custom system on a custom target, and here it becomes critical when installer uses more resources than the workload which it is supposed to install.
This does happen currently. I may want to run nothing but a static web page on my tiny home lab server, but I have to run entire desktop environment and dnf to get that homelab setup. And here remote web installation can help, because it removes that overhead. The dnf part still will be a problem in that case, but it can be improved with bootc.
You do need to put some effort in your arguments.
Seems like networking is not an issue. It either works or it doesn’t.
Good point will only work for wired connections.
Could the installer advertise itself via mDNS?
Maybe in a form of fedora-<ip_with_dashes>.local or fedora-<randomID>.local ?
Reason: It could be difficult to figure out the IP assigned by DHCP to a headless node.
I’ve not use mDNS for much as I run my own DHCPD and can always find the IP/Name being used by a device.
How would you know what the mDNS name used was?
Is it easy to query all the names seen by the mDNS?
Yes, I am able to enumerate mDNS names with:
avahi-browse -aAlternative idea, which probably could be a bit controversial, is to use an mDNS name hardcoded in the kickstart config, like
fedora-installer.local.This option should be configurable, including possibility of disabling it completely.
For small-scale use, it would be helpful. For fleets of computers, an automation would anyway be required.
In any case, the installer web page shall display the IP address and possibly other identification (MAC address, BIOS machine id/serial number) of the machine being installed. This will be useful even without mDNS.
CircuitPython implements a similar feature on ESP32 hardware, using http://circuitpython.local as a simple way to find your device. When multiple devices are on the same network, one responds with a welcome page that includes a section titled “Here are other CircuitPython devices on your network.”
Could a web console that displays the text-mode installation serve as a lightweight headless option?
@orichalcum Both your ideas sound really cool to me.