Stream Ubuntu Desktop to iPad
Stream your Ubuntu desktop to an iPad with low-latency NVENC encoding.
Introduction
30 Second Summary
Your desktop PC has all the horsepower, but sometimes you want to work from the couch or the kitchen table with just your iPad. The dream is using your full development environment from a lightweight device without any compromise on text clarity.
In this project, you will set up a low-latency remote desktop stream from your Ubuntu PC to your iPad using Sunshine, Moonlight, and Tailscale. You'll optimize it specifically for developer workflows where crisp text matters more than fast-moving graphics.
What You'll Build
You open Moonlight on your iPad from anywhere on your Tailscale network, tap your PC, and start coding on a crisp, responsive remote desktop powered by your GPU's hardware encoder.
By the end of this project, you'll have:
- A remote desktop on your iPad so responsive that typing in your terminal feels local, driven by NVENC hardware encoding on your 5070 Ti.
- Text rendering sharp enough to comfortably read 12pt monospace code, thanks to HEVC encoding tuned for static content rather than gaming.
- A Tailscale-optimized connection that stays smooth with no micro-stutter or dropped frames, whether you're in the next room or across your network.
- Secret Mission: Add a custom application entry that launches your preferred IDE at your iPad's native resolution for a pixel-perfect coding experience.
Are there any prerequisites?
This project assumes you have an Ubuntu 26.04 PC with an NVIDIA 5070 Ti (or comparable NVIDIA GPU), an iPad with a Magic Keyboard, and Tailscale already installed and connected on both devices.
If you haven't set up Tailscale yet, install it on both your PC and iPad and confirm they can see each other on your tailnet before starting.
Before We Start
Before We Start...
Before we dive in, let's lock in what you're about to build and why it matters for your developer workflow.
Install and Launch Sunshine
Without a streaming host running on your PC, your iPad has nothing to connect to. Sunshine is the server half of the streaming equation. It captures your desktop, encodes it with your GPU, and serves the video stream to Moonlight clients.
In this step, you will install Sunshine from the latest release, start its systemd service, and confirm it is using XDG Desktop Portal for screen capture on your Wayland session.
In this step, get ready to:
- Install the Sunshine .deb package on your Ubuntu 26.04 system.
- Start the Sunshine service and create admin credentials via the web UI.
- Verify that XDG Desktop Portal capture is active in the Sunshine logs.
Install Sunshine from the latest release
Sunshine distributes pre-built .deb packages for each Ubuntu version. You will download the Ubuntu 26.04 package directly from the GitHub releases page and install it with dpkg.
- Open a terminal on your Ubuntu PC by pressing Ctrl+Alt+T.
- Download the latest Sunshine release for Ubuntu 26.04 by running this command:
wget https://github.com/LizardByte/Sunshine/releases/latest/download/sunshine-ubuntu-26.04-amd64.deb
- Install the downloaded package by running:
sudo dpkg -i ./sunshine-ubuntu-26.04-amd64.deb
What do these commands do?
The wget command downloads the Sunshine .deb package from LizardByte's GitHub releases. This is the official distribution method for Sunshine on Ubuntu.
The sudo dpkg -i command installs the package onto your system, including the Sunshine binary, its systemd service file, and all required libraries.
- If dpkg reports missing dependencies, fix them by running:
sudo apt --fix-broken install -y
- Confirm Sunshine is installed by running:
dpkg -l | grep sunshine
You should see a line showing sunshine with a version number and an ii status indicating it is installed.
Not seeing sunshine in the output?
Make sure you ran the wget command from the same directory where you ran dpkg -i. If the file downloaded elsewhere, provide the full path to the .deb file.
If you see dependency errors after apt --fix-broken install, run the dpkg -i command again after the dependencies resolve.
Help me troubleshoot my Sunshine installation on Ubuntu 26.04
Start Sunshine and create admin credentials
Sunshine runs as a systemd user service. Starting it registers Sunshine with your desktop session so it can capture your screen through the XDG Desktop Portal.
- Start the Sunshine service by running:
systemctl --user start app-dev.lizardbyte.app.Sunshine
- Confirm the service is running by checking its status:
systemctl --user status app-dev.lizardbyte.app.Sunshine
You should see Active: active (running) in the output.
What is a systemd user service?
A systemd user service runs under your user account rather than as root. This is important for Sunshine because the XDG Desktop Portal requires access to your active desktop session to capture it.
The service name app-dev.lizardbyte.app.Sunshine follows the XDG Portal naming convention. This allows the portal to properly identify and authorize Sunshine for screen capture.
Service failed to start?
Make sure you are running the command from within your graphical desktop session, not over SSH. The XDG Desktop Portal requires an active GNOME session to function.
Help me troubleshoot Sunshine systemd user service not starting on Ubuntu 26.04 GNOME Wayland
Now you need to set up admin credentials for the Sunshine web UI.
- Open your web browser on the Ubuntu PC.
- Type https://localhost:47990 in the address bar and press Enter.
- Your browser will show a certificate warning because Sunshine uses a self-signed certificate. Click Advanced, then click the option to proceed to the site.
- On the initial setup page, enter a username and password for the Sunshine admin panel.
- Click Submit to save your credentials.
You should now see the Sunshine web dashboard. This confirms the service is running and the web UI is accessible.
Cannot reach the web UI?
Check that the service is still running with systemctl --user status app-dev.lizardbyte.app.Sunshine. If it shows inactive, start it again.
Sunshine only serves over HTTPS. Make sure you typed https:// and not http:// in the address bar.
Help me access the Sunshine web UI at https://localhost:47990
Verify XDG Desktop Portal capture is active
On Wayland, Sunshine cannot use NvFBC (that method only works on X11). Instead, it uses the XDG Desktop Portal to capture your screen. You need to confirm this is the active capture method before moving on.
Before you check the logs, what capture method do you expect Sunshine to be using on your GNOME Wayland session?
- Check the Sunshine logs for the active capture method by running:
journalctl --user -u app-dev.lizardbyte.app.Sunshine --no-pager | grep -i "portal\|capture\|display"
What are you looking for in the logs?
When XDG Desktop Portal capture is working correctly, you will see log lines referencing the portal capture method and your Wayland display being detected.
You should NOT see NvFBC mentioned as the active capture method. NvFBC requires X11, which your GNOME Wayland session does not use.
You should see log output confirming that portal-based capture is active and that your Wayland display was found. This means your 5070 Ti's NVENC encoder will handle video encoding while the portal handles screen capture.
Not seeing portal-related output in the logs?
Make sure the xdg-desktop-portal service is running. Check with:
systemctl --user status xdg-desktop-portal
If it is not active, start it with systemctl --user start xdg-desktop-portal and then restart Sunshine.
Help me get XDG Desktop Portal capture working with Sunshine on Ubuntu 26.04 GNOME Wayland
Your Sunshine server is installed, running, and confirmed to be using the correct capture method for your Wayland session. Next up, you will connect Moonlight on your iPad and see your desktop stream for the first time.
Pair Moonlight and Get Your First Stream
Sunshine is running on your PC and waiting for a client to connect. Right now, nothing is talking to it.
The fastest way to prove the whole system works is to see your desktop appear on your iPad. In this step, you'll install Moonlight, point it at your PC's Tailscale IP, and start streaming. The image quality won't be perfect yet, but that's intentional. Seeing your full desktop on your iPad is the milestone.
In this step, get ready to:
- Install Moonlight on your iPad from the App Store.
- Pair Moonlight with Sunshine using a PIN code.
- Start your first desktop stream with Magic Keyboard input.
Install Moonlight on iPad and add your PC
Moonlight is the client app that receives the video stream from Sunshine. You need to install it on your iPad and tell it where your PC lives on the network.
- On your Ubuntu PC, find your Tailscale IP address by running this command in a terminal:
tailscale ip -4
You'll see a single IPv4 address (something like 100.x.y.z). Write this down or keep the terminal visible.
Not seeing an IP address?
Make sure the Tailscale daemon is running. You can check its status with tailscale status. If it shows as stopped, start it with sudo systemctl start tailscaled.
Help me troubleshoot my Tailscale connection on Ubuntu.
- On your iPad, open the App Store.
- Search for Moonlight Game Streaming and tap Get to install it.
- Open Moonlight once it finishes installing.
Why Moonlight?
Moonlight is a free, open-source client that speaks the same streaming protocol NVIDIA originally built for their Shield devices. Sunshine implements the server side of this protocol on any GPU. Together they deliver hardware-accelerated, low-latency streaming without any subscription or cloud service.
- In Moonlight, tap the + button in the top-right corner to add a host manually.
- Enter your Ubuntu PC's Tailscale IP address (the 100.x.y.z value from earlier) and tap Add Host.
After a moment, your PC should appear in Moonlight's host list with a computer icon. If it shows a question mark or loading spinner, give it a few seconds to connect over Tailscale.
Pair the devices using the PIN
Sunshine requires a one-time PIN pairing before it trusts a new client. This prevents unauthorized devices from connecting to your stream.
- In Moonlight on your iPad, tap your PC's entry in the host list.
- Moonlight will display a 4-digit PIN on screen. Keep this visible.
- Switch to your Ubuntu PC and return to the Sunshine web UI in your browser at https://localhost:47990.
- Click the Pin tab in the navigation bar.
- Enter the 4-digit PIN shown on your iPad into the PIN field.
- Click Send.
Moonlight on your iPad should now show your PC as paired. The question mark or lock icon disappears, replaced by a list of available applications (you'll see at least a Desktop entry).
PIN not being accepted?
Make sure you enter the PIN within 30 seconds of it appearing. Moonlight generates a new PIN each time you tap the host, so if it expired, tap your PC again to get a fresh one.
Also confirm you're entering the PIN in the Pin tab (not the Configuration tab) of the Sunshine web UI.
Help me troubleshoot Moonlight PIN pairing with Sunshine.
Start a Desktop stream
Everything is connected and authorized. Time to see your desktop on your iPad.
- In Moonlight on your iPad, tap the Desktop entry.
Before it connects, what do you expect to see? Think about what Sunshine is capturing on your Ubuntu PC right now.
Your full Ubuntu desktop appears on your iPad. You're looking at the same screen your monitor shows, streamed over your Tailscale network using your 5070 Ti's NVENC hardware encoder.
- Try moving the cursor using your Magic Keyboard's trackpad. The pointer on the remote desktop should follow your input.
- Open a terminal on the remote desktop (press Ctrl+Alt+T on your Magic Keyboard) and type a few characters to confirm keyboard input is working.
You now have a working remote desktop stream from your Ubuntu PC to your iPad. Keyboard, mouse, and display are all live.
What about the image quality?
You'll likely notice that text looks a bit blurry or smeared, especially in terminals and code editors. This is expected. The default streaming settings are optimized for fast-moving game content, not static text. The next step fixes this.
Seeing a black screen or getting disconnected?
A black screen usually means XDG Desktop Portal hasn't granted capture permission for this session. On your Ubuntu PC, check if a permission dialog appeared asking to share your screen. Accept it.
If the stream connects and immediately drops, verify Tailscale is still connected on both devices by running tailscale status on your PC.
Help me fix my Moonlight stream showing a black screen or dropping the connection.
Your remote desktop is live. Next up, you'll fix that blurry text by switching to developer-optimized encoding settings that make your terminal and code editor razor-sharp.
Fix the Blurry Text Problem
Your stream is working, but if you open a terminal or code editor on your streamed desktop, you will notice the text looks blurry and smeared.
This happens because Sunshine's default streaming settings are optimized for gaming. Fast-moving content tolerates lower quality, but static text does not. In this step, you will switch to encoding settings tuned for developer workflows where every character needs to be sharp.
In this step, get ready to:
- Switch Moonlight to the HEVC codec for better text compression.
- Increase bitrate and match your iPad's native resolution.
- Tune the NVENC quality preset and enable spatial AQ in Sunshine.
Switch to HEVC codec in Moonlight
H.264 was designed for fast-moving video. HEVC (H.265) uses more advanced compression that handles static content like text and UI elements much better at the same bitrate.
- On your iPad, disconnect from the current stream by pressing the iPad's screen with three fingers and tapping the X to quit.
- In Moonlight's main screen, tap the gear icon to open settings.
- Find the video codec selector and change it from H.264 to HEVC.
Why HEVC for coding?
HEVC uses superior intra-prediction and transform coding compared to H.264. At the same bitrate, HEVC produces sharper text edges because it can represent fine detail in static frames more efficiently. Your iPad's hardware decoder handles HEVC natively, so there is no performance penalty on the client side.
- Go back to Moonlight's main screen and tap your PC to reconnect.
- Open a terminal on your streamed desktop.
You should already notice text is slightly less smeared compared to before. The difference will be subtle at this point because the bitrate and resolution still need tuning.
Stream won't connect after switching codec?
Make sure you fully disconnected the previous stream before changing the codec. Moonlight applies codec changes only on a new connection, not mid-stream.
help me troubleshoot my Moonlight HEVC connection to Sunshine
Increase bitrate and set resolution to match your iPad
Default bitrate is too low for crisp text, and a mismatched resolution forces scaling that blurs every character. You will fix both in Moonlight's settings.
- Disconnect from the stream again (three-finger tap, then quit).
- Open Moonlight's settings by tapping the gear icon.
- Find the bitrate slider and increase it to 40-50 Mbps. Your Tailscale connection over a local network easily handles this.
- Find the resolution setting and set it to match your iPad's native display resolution. For example, iPad Air M2 uses 2388x1668, iPad Pro 11-inch uses 2388x1668, and iPad Pro 13-inch uses 2732x2048.
Why match the native resolution?
When the stream resolution does not match your iPad's display, the system scales the image to fit. Scaling introduces interpolation that softens text edges. By streaming at the exact native resolution, every pixel the encoder produces maps one-to-one to a physical pixel on your screen. The result is text that looks as if you are sitting at your desktop monitor.
- Return to Moonlight's main screen and tap your PC to reconnect.
- Open a terminal on your streamed desktop and run a command that outputs text, such as:
ls -la ~
Text should now be noticeably sharper than with the defaults. Individual characters in your terminal's monospace font are distinguishable, but you may still see slight softness on thin strokes.
Text still looks blurry at higher bitrate?
Double-check that your resolution matches your iPad's native display exactly. Even a small mismatch (like 1920x1080 on a non-16:9 iPad) causes scaling artifacts that no amount of bitrate can fix.
help me figure out why my Moonlight stream text is still blurry after increasing bitrate
Tune NVENC quality preset and enable spatial AQ
The encoder on your PC is the last piece of the puzzle. Sunshine's default NVENC preset prioritizes encoding speed over compression quality. For a developer workflow, you can afford slightly more encoding time in exchange for sharper text.
- On your Ubuntu PC, open a browser and navigate to:
https://localhost:47990
- Log in with the admin credentials you created earlier.
- Click the Configuration tab in the navigation.
- Scroll down to the NVIDIA NVENC Encoder section.
- Change nvenc_preset from 1 (fastest) to 5 or 6. Higher numbers improve compression quality at the cost of slightly more encoding time.
- Find nvenc_spatial_aq and change it from disabled to enabled.
- Click Save and then Apply to restart Sunshine with the new settings.
What does spatial AQ do?
Spatial Adaptive Quantization allocates more bits to complex areas of the frame (like text with fine edges) and fewer bits to uniform areas (like solid backgrounds). For developer workflows where text is the primary content, this gives the encoder more budget exactly where it matters most.
Before you reconnect from your iPad, what do you think the text will look like compared to your last session?
- On your iPad, open Moonlight and tap your PC to start a new stream.
- Open a terminal on the streamed desktop and run:
cat /etc/os-release
Characters are now sharp and individually distinguishable. There should be no smearing or color fringing on text edges. Small monospace text in your terminal reads cleanly, as if you are looking at a local display.
Text still soft after changing NVENC settings?
Confirm Sunshine actually restarted by checking the web UI still loads. If you see the old settings, click Apply again. You may also need to disconnect and reconnect from Moonlight, since encoder changes only take effect on new sessions.
help me verify that my Sunshine NVENC settings are being applied
Your stream now delivers crisp, readable text from your Ubuntu desktop to your iPad. Next up, you will tune the network layer so the stream stays smooth and stutter-free over your Tailscale VPN tunnel.
Tune for Reliable Tailscale Streaming
Your stream looks crisp, but you may notice periodic micro-stutter or dropped frames while scrolling code. The culprit is packet fragmentation.
Tailscale wraps every packet in a WireGuard tunnel, which adds overhead to each packet. When Sunshine sends a video packet that exceeds the tunnel's maximum size, the network stack splits it into fragments. Those fragments arrive out of order or get dropped, causing the stutter you see on your iPad.
In this step, get ready to:
- Set the optimal packet size to prevent VPN fragmentation.
- Disable redundant encryption to reduce latency.
- Enable remote web UI access over Tailscale for future configuration.
Configure packetsize for Tailscale MTU
Tailscale's tunnel interface uses a default MTU of 1280 bytes. Every video packet Sunshine sends must fit within that limit after accounting for protocol headers.
The calculation works like this: MTU (1280) minus IPv4 header (20) minus UDP header (8) minus Sunshine overhead (16) equals 1236.
- Open the Sunshine configuration file for editing by running:
nano ~/.config/sunshine/sunshine.conf
- Add the following line to the file:
# Prevent packet fragmentation over Tailscale's 1280-byte MTU tunnel
packetsize = 1236
Why 1236 specifically?
The Sunshine documentation states that packetsize helps avoid packet loss and micro-stutter on a layer 2 VPN with clients that cannot configure this value (like Moonlight for iOS).
By setting it to 1236, each UDP video packet fits cleanly inside Tailscale's 1280-byte MTU without requiring fragmentation. Fragmented packets that arrive out of order cause the periodic stutter you see during scrolling.
Do not save yet. You will add two more settings before saving and restarting.
Disable double encryption
Tailscale already encrypts all traffic through its WireGuard tunnel. Sunshine's own encryption layer on top of that is redundant and adds CPU overhead to every frame.
- In the same sunshine.conf file, add this line below the packetsize setting:
# Tailscale already encrypts via WireGuard - skip Sunshine's LAN encryption
lan_encryption_mode = 0
What does lan_encryption_mode control?
Setting lan_encryption_mode to 0 disables Sunshine's built-in encryption for LAN connections. Since Tailscale's WireGuard tunnel already encrypts everything end-to-end, this avoids encrypting the stream twice and reduces latency per frame.
Configure CSRF origins for Tailscale web UI access
Right now you can only access Sunshine's web UI from https://localhost:47990 on your PC. To manage settings from your iPad over Tailscale, you need to allow your Tailscale hostname as a trusted origin.
- First, find your PC's Tailscale hostname by running this in a separate terminal:
tailscale status --self --json | jq --raw-output .Self.DNSName | sed 's/\.$//'
What does this command do?
This extracts your machine's full MagicDNS name from Tailscale's status output. It will look something like your-pc-name.tailnet-name.ts.net.
- Copy the hostname from the output.
- Return to your nano editor and add this line below lan_encryption_mode, replacing the hostname with yours:
# Allow Sunshine web UI access from iPad over Tailscale
csrf_allowed_origins = https://[[TAILSCALE_HOSTNAME="your-pc-name.tailnet-name.ts.net"]]:47990
Why is this needed?
Sunshine's web UI rejects requests from origins it does not recognize (a security measure called CSRF protection). When you browse to the web UI using your Tailscale hostname instead of localhost, the origin changes and gets blocked unless you add it to csrf_allowed_origins.
- Save the file by pressing Ctrl+O then Enter, and exit nano with Ctrl+X.
- Restart Sunshine to apply the new configuration by running:
systemctl --user restart app-dev.lizardbyte.app.Sunshine
- Confirm the service restarted cleanly by running:
systemctl --user status app-dev.lizardbyte.app.Sunshine
You should see Active: active (running) in the output with a recent start timestamp.
Service failed to start?
Check for typos in your config file. A missing equals sign or extra space in sunshine.conf can prevent Sunshine from launching.
Run journalctl --user -u app-dev.lizardbyte.app.Sunshine --no-pager -n 20 to see the last 20 log lines and identify the config error.
help me debug my Sunshine config file errors
Now verify the full configuration file matches what you expect.
✔️ Awesome, I've got everything!
Great. Double check you saved your file and that the service is running.
ⓧ I'd like to double check the full code
Your ~/.config/sunshine/sunshine.conf should contain these three new lines (in addition to any settings Sunshine already wrote to the file):
packetsize = 1236
lan_encryption_mode = 0
csrf_allowed_origins = https://your-pc-name.tailnet-name.ts.net:47990
Verify smooth streaming over Tailscale
Time to prove the fix works. Before you reconnect, think about what you expect to see differently compared to before these changes.
- On your iPad, disconnect from the current Moonlight session if one is still active.
- Reconnect to your PC by tapping its entry in Moonlight, then tap Desktop.
- Open a code editor or terminal on the streamed desktop and scroll through a file with dense text for 60 seconds.
- While scrolling, enable Moonlight's performance overlay by holding three fingers on your iPad screen.
Do you expect to see stutter in the overlay, or a clean frame time graph?
The stream should be smooth with no periodic stutter or hitching. The performance overlay should show consistent frame times without spikes.
Still seeing micro-stutter?
Verify the config took effect by checking Sunshine's logs for the packetsize value. Run journalctl --user -u app-dev.lizardbyte.app.Sunshine | grep -i packet and confirm 1236 appears.
If stutter persists, try lowering the bitrate in Moonlight from 50 to 30 Mbps. Some Tailscale relay paths have lower bandwidth than a direct connection.
help me troubleshoot micro-stutter in my Moonlight stream over Tailscale
- To confirm remote web UI access works, open Safari on your iPad and navigate to https:// followed by your Tailscale hostname and :47990.
You should see the Sunshine web UI login page load. This confirms csrf_allowed_origins is working and you can manage Sunshine remotely from your iPad.
Web UI shows a CSRF error?
Make sure the hostname in csrf_allowed_origins exactly matches the hostname you typed in Safari's address bar (including https:// and the port :47990).
Check for trailing spaces or missing characters in the config. The origin must be character-for-character identical to what the browser sends.
help me fix Sunshine CSRF errors when accessing the web UI over Tailscale
Your stream is now tuned for reliable, low-latency use over Tailscale. Next up, you will push this setup further by launching your IDE directly from Moonlight at the perfect resolution for your iPad display.
Secret mission
Launch Your IDE at the Perfect Resolution
Instead of streaming your entire desktop, what if Moonlight could launch directly into your code editor at a resolution perfectly matched to your iPad's display? In this bonus challenge, you'll add a custom application entry in Sunshine that opens your IDE at your iPad's native resolution, then reverts your PC's display when you disconnect.
Clean Up Your Resources
Clean Up Your Resources
This project runs entirely locally with free, open-source tools. There are no ongoing cloud costs or subscriptions to worry about.
Decide whether to keep your resources running, pause them to come back later, or delete them entirely.
Resources you used:
- Sunshine systemd user service running on your Ubuntu PC (local, no cost).
- Sunshine configuration directory at ~/.config/sunshine (includes your custom application entries and streaming settings).
- Moonlight app installed on your iPad (free app, no subscription).
Keep everything running
No action needed. Choose this if you plan to keep streaming your Ubuntu desktop to your iPad regularly.
- Sunshine will continue running as a systemd user service whenever you are logged in.
- To ensure Sunshine starts automatically at boot, run:
systemctl --user --now enable app-dev.lizardbyte.app.Sunshine
- Moonlight stays on your iPad ready to connect whenever you need it.
- Your Tailscale network remains active, so you can connect from anywhere.
Pause - I'll come back to this later
Stop the Sunshine service to free up system resources when you are not streaming. Your configuration and paired devices are preserved.
- Stop the Sunshine service by running:
systemctl --user stop app-dev.lizardbyte.app.Sunshine
- To prevent it from starting automatically at login, run:
systemctl --user disable app-dev.lizardbyte.app.Sunshine
- When you want to stream again, start it back up with:
systemctl --user start app-dev.lizardbyte.app.Sunshine
- Your paired devices, encoding settings, custom application entries, and Tailscale configuration are all preserved in ~/.config/sunshine.
Delete - I don't want to use this again
Remove all project resources from your Ubuntu PC and iPad.
- Stop and disable the Sunshine service by running:
systemctl --user stop app-dev.lizardbyte.app.Sunshine
systemctl --user disable app-dev.lizardbyte.app.Sunshine
- Uninstall the Sunshine package by running:
sudo apt remove sunshine
- Delete the Sunshine configuration directory (this removes all your settings, paired devices, and custom application entries) by running:
rm -rf ~/.config/sunshine
- On your iPad, press and hold the Moonlight app icon, then tap Remove App and confirm deletion.
- Your Tailscale network is unaffected by these changes. It was a prerequisite and serves other purposes beyond this project.
Nice Work!
Nice Work!
Nice work! You just built a fully optimized remote development setup that streams your Ubuntu desktop to your iPad with developer-grade clarity over your Tailscale network.
You've learned how to:
- Set up Sunshine with XDG Desktop Portal capture on your GNOME Wayland session and paired it with Moonlight on your iPad over Tailscale.
- Optimized HEVC encoding with a high-quality NVENC preset and spatial AQ for razor-sharp text rendering in your terminal and code editor.
- Tuned network settings for Tailscale streaming by calculating optimal packetsize to prevent VPN fragmentation, disabling redundant encryption, and configuring remote web UI access.
- Secret Mission: Added a custom application entry in Sunshine that launches your IDE at your iPad's native resolution for a pixel-perfect coding experience.
Ready to quiz yourself?