Install¶
FiaOS has two servers that share the same routes, UI and session format:
server.pyat the repo root, for macOSwindows/server.py, for Windows 10/11
Both listen on port 9000 on all interfaces (0.0.0.0). The port is hard-coded as PORT = 9000 in both files.
macOS¶
Requires: Apple Silicon Mac, macOS 14+, Python 3.12+ (from the README; TODO-VERIFY whether Intel Macs or older macOS work, nothing in the code checks for them).
git clone https://github.com/nicedreamzapp/FiaOS.git
cd FiaOS
python3.12 -m venv .venv
.venv/bin/pip install aiohttp psutil numpy anthropic pillow pyobjc-framework-Quartz
The venv must be at FiaOS/.venv. The server launches its screen worker, input driver and mouse helper with the hard-coded path .venv/bin/python3 next to server.py.
Don't use requirements.txt or pyproject.toml
Both files are left over from the PersonaPlex voice project. They pull in mlx, rustymimi, sounddevice and other packages the screen and terminal don't use, and they leave out anthropic, pillow and pyobjc-framework-Quartz, which the server does import. Install the list above instead.
Why each package is needed, from the imports:
| Package | Imported by |
|---|---|
aiohttp |
server.py (web server, WebSockets) |
psutil |
server.py (status, processes) |
anthropic |
executor.py imports it at the top, so the server won't start without it, even though the helper actually calls the claude CLI |
numpy, pillow |
screen_worker.py (tiling and JPEG encoding) |
pyobjc-framework-Quartz |
screen_worker.py, input_helper.py, screencast.py |
macOS permissions¶
- Screen Recording. Give it to the terminal app you start FiaOS from, or to the venv's Python if it runs as a LaunchAgent: System Settings > Privacy & Security > Screen Recording. Without it the screenshot route returns an error instead of your desktop.
- Accessibility. Mouse and keyboard events are posted with Quartz
CGEventPost. TODO-VERIFY: macOS usually asks for Accessibility permission before it accepts synthetic input, but the README and code don't mention this. The/api/keyboardroute also drivesSystem Eventsthroughosascript, which normally triggers an Automation prompt.
Windows¶
Requires: Windows 10/11, Python 3.12+. The server must run in the interactive desktop session of a logged-in user. Screen capture (GDI BitBlt) and SendInput don't work from a Windows service.
git clone https://github.com/nicedreamzapp/FiaOS.git
cd FiaOS\windows
Copy-Item -Recurse ..\static .\static # windows\server.py serves windows\static, which isn't committed
py -3.12 -m venv .venv
.venv\Scripts\pip install -r requirements-windows.txt
windows/requirements-windows.txt lists aiohttp>=3.10.5,<3.11, numpy>=2.1.0, Pillow>=10, psutil>=6.0.0 and pywinpty>=2.0.13. The Windows executor.py doesn't import anthropic, so it isn't needed there.
The Windows server looks for its venv at windows\.venv\Scripts\python.exe. If that file doesn't exist it falls back to whatever Python is running the server (sys.executable).
Then create C:\ProgramData\fia\fiaos.env:
windows/run_fiaos.ps1 reads this file. Only lines matching NAME=value, where the name is upper-case letters and underscores, are loaded. See Configuration for every variable.
Optional: Claude Code and Ollama¶
You don't need either one for the screen or terminal. They are only used by the natural-language command helper (POST /api/command):
- The helper runs the Claude Code CLI as
claude -p. On macOS it findsclaudeonPATH, or falls back to~/.local/bin/claude. On Windows it also triesclaude.cmd,%APPDATA%\npm\claude.cmd,~\.local\bin\claude.exeand~\AppData\Local\Programs\claude\claude.exe. - If the Claude call fails, it falls back to a local Ollama model,
qwen3-coder.
You can of course run claude interactively in the Terminal tab. That is just a normal shell session.
Next¶
Go to the Quickstart to set the password and open the page.