Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .github/workflows/desktop-fedora.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: Standalone desktop (Fedora)
on:
push:
pull_request:
jobs:
desktop:
runs-on: ubuntu-latest
container: registry.fedoraproject.org/fedora:44
steps:
- name: Build dependencies
run: dnf install -y git gcc make binutils python3 pkgconf-pkg-config wayland-devel wayland-protocols-devel libxkbcommon-devel libxcrypt-devel libseat-devel openssl-devel nodejs npm
- uses: actions/checkout@v4
- run: npm ci
- run: make -j2 check CFLAGS='-O2 -g -D_FORTIFY_SOURCE=3 -fstack-protector-strong'
- name: Stage installation
run: make install PREFIX=/usr DESTDIR="$RUNNER_TEMP/lord-de"
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ assets/locales/*.tgz
logs/
/code-manifest.json
/code-manifest.sig
/build-profile.json
*.rpm
/dist/
# the desktop imager's builds (desktop/imager, docs/IMAGER.md)
desktop/imager/target/
desktop/imager/dist/
Expand Down
17 changes: 17 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
PREFIX ?= /usr/local
LIBEXECDIR ?= $(PREFIX)/libexec
PYTHON ?= python3

.PHONY: all themes server check test install clean
all: themes server
themes:
LORD_PROFILE=desktop npm run build
server:
$(MAKE) -C server PROFILE=desktop
check test: all
$(MAKE) -C server PROFILE=desktop test-platform
$(PYTHON) tools/desktop/check.py
install:
$(PYTHON) tools/desktop/install.py --prefix '$(PREFIX)' --libexecdir '$(LIBEXECDIR)' --destdir '$(DESTDIR)'
clean:
$(MAKE) -C server clean
179 changes: 69 additions & 110 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,127 +1,86 @@
<p align="center">
<a href="https://lordos.org">
<img src="docs/brand/png/logo-horizontal-light-800.png#gh-light-mode-only" alt="LordOS" width="360">
<img src="docs/brand/png/logo-horizontal-dark-800.png#gh-dark-mode-only" alt="LordOS" width="360">
</a>
</p>

<h3 align="center">The free, fast and secure Linux desktop.</h3>

<p align="center">
<a href="https://lordos.org"><b>lordos.org</b></a> ·
<a href="https://lordos.org/#download">Download</a> ·
<a href="https://lordos.org/features/own-desktop/">Features</a> ·
<a href="https://lordos.org/gallery/">Gallery</a> ·
<a href="https://lordos.org/paper/">Paper</a> ·
<a href="https://lordos.org/faq/">FAQ</a> ·
<a href="docs/README.md">Docs</a>
</p>

LordOS is a free GNU/Linux distribution based on Debian, with its own desktop environment:
a display server and Wayland compositor written in C, its own interface engine, and native apps
made to feel calm, clear and private. It runs on 64-bit PCs and on the Raspberry Pi 5, and the
Linux apps you already use (Chromium, Firefox, GTK and Qt apps) run alongside the native ones.

<p align="center">
<img src="docs/screenshots/desktop-overview-light.png#gh-light-mode-only" alt="The LordOS desktop" width="860">
<img src="docs/screenshots/desktop-overview-dark.png#gh-dark-mode-only" alt="The LordOS desktop in dark mode" width="860">
</p>

## Everything you need. Nothing you don't.

| | |
|---|---|
| **[A desktop of its own](https://lordos.org/features/own-desktop/)** | Its own display server and Wayland compositor in C and its own interface engine, on a solid Debian base. Smooth on any 64-bit PC (amd64), and light enough for the Raspberry Pi 5 (arm64). |
| **[Private by design](https://lordos.org/features/private-by-design/)** | Installable LordOS apps run isolated and ask before using your camera, microphone, files or network. You decide. |
| **[A firewall you can see](https://lordos.org/features/visible-firewall/)** | Watch every connection on a live world map, then allow or block it per app, by domain, address or network, and restrict camera, microphone, files and more. |
| **[Passwords built in](https://lordos.org/features/passwords/)** | A vault for passwords, 2FA codes and cards that unlocks with a password or a USB key. |
| **[Mail, Calendar, Contacts](https://lordos.org/features/mail-calendar/)** | Native apps for your accounts, with remote images blocked until you say so. |
| **[Your Linux apps too](https://lordos.org/features/linux-apps/)** | Chromium, Firefox and GTK apps fit right in, with the same window frame and dark mode. |

Measured, not promised: the whole system idles at **465–487 MB of RAM**, of which `lord-server`
(the display server with the whole desktop) is **32–36 MB**, and boots in about **16 s** (see
[`docs/ISO.md`](docs/ISO.md), "Final ISO test"). What is isolated today, exactly, is in
[`docs/PRIVACY.md`](docs/PRIVACY.md).

## Get LordOS

Releases are signed and published on [GitHub Releases](https://github.com/lordbasex/LordOS/releases)
and on [lordos.org](https://lordos.org/#download).

- **PC (64-bit):** a live and installable ISO. Try it without installing.
- **Raspberry Pi 5:** a ready-to-flash image for SD card or NVMe, with fan control and our own
kernel. The Raspberry Pi 5 is the only supported board.
- **Already on Debian 13?** Install LordOS on top of your current system with one command:

```sh
curl -fsSL https://lordos.org/install.sh | sh
```

**Verify your download.** `SHA256SUMS` is signed with the LordOS release key (Ed25519),
fingerprint `c7155b8e6bbbb180f907381994d06af76d333016cd6f3facf67cadd053ea108e`. See
[code signing](https://lordos.org/legal/code-signing/) and [`docs/SIGNING.md`](docs/SIGNING.md).

Status: **beta**. See [`CHANGELOG.md`](CHANGELOG.md) and [`docs/ROADMAP.md`](docs/ROADMAP.md).

## Documentation

- [`docs/README.md`](docs/README.md): the index of every document.
- [The paper](https://lordos.org/paper/) ([`docs/PAPER.md`](docs/PAPER.md)): vision, architecture,
security model, performance and roadmap, with links to the source files.
- [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md): components, processes and dependencies.

## Repository map

- `server/`: `lord-server` (display server and Wayland compositor: DRM/KMS and evdev straight
from the kernel, without X11, libdrm or libinput) plus `lord-sessiond`, `lord-netd`,
`lord-netperm`, `lord-fand` and the sandboxed helpers (`lord-media`, `lord-doc`, `lord-vault`,
`lord-maild`).
- `runtime/`: `@lordos/runtime`, the React renderer for lord-server.
- `sdk/`: `@lordos/sdk`, the API for themes and apps.
- `apps/`: the native apps. See [`apps/README.md`](apps/README.md).
- `themes/`: complete desktops in React, swappable live. See [`themes/README.md`](themes/README.md).
- `assets/`: fonts, icons, the brand and Lumo, and the UI texts per language.
- `tools/`: ISO and Raspberry Pi image builders, the Debian installer, release signing, the website.
- `web/`: the [lordos.org](https://lordos.org) website.
- `third_party/`: QuickJS, stb, Monocypher and word lists, vendored (see [`THIRD_PARTY.md`](THIRD_PARTY.md)).

## Building from source

On the development machine (needs Node.js):
# Lord DE

Fork do [LordOS](https://github.com/lordbasex/LordOS) dedicado a extrair e desenvolver seu ambiente de desktop como um projeto independente da distribuição. Fedora é a primeira plataforma de integração deste fork.

O compositor Wayland em C, o motor gráfico, o runtime React, os temas e os aplicativos nativos continuam sendo os componentes do desktop. A distribuição fornece o kernel, o login, a rede, o áudio e o gerenciamento dos pacotes do sistema.

**Estado: experimental.** A compilação e a inicialização sem monitor são verificáveis em contêiner Fedora. A sessão física com logind/seatd ainda precisa ser validada em hardware, incluindo troca de TTY, GPU, suspensão e SELinux.

## Compilar no Fedora

```sh
sudo dnf install gcc make binutils python3 pkgconf-pkg-config \
wayland-devel wayland-protocols-devel libxkbcommon-devel \
libxcrypt-devel libseat-devel openssl-devel nodejs npm
npm ci
make -j4
make check
```

Node.js e npm são usados apenas para compilar os temas. A execução do desktop não depende deles. O caminho padrão usa a composição por CPU quando as bibliotecas Mesa de desenvolvimento estão ausentes. A composição por GPU continua opcional:

```sh
sudo dnf install mesa-libgbm-devel mesa-libEGL-devel mesa-libGLES-devel
make -j4
```

Documentação dos pacotes: [Wayland](https://packages.fedoraproject.org/pkgs/wayland/wayland-devel/), [libxkbcommon](https://packages.fedoraproject.org/pkgs/libxkbcommon/libxkbcommon/), [libseat](https://packages.fedoraproject.org/pkgs/seatd/libseat-devel/), [Node.js](https://developer.fedoraproject.org/tech/languages/nodejs/nodejs.html).

## Instalar e executar

Para inspecionar a instalação sem alterar o sistema:

```sh
make install PREFIX=/usr DESTDIR="$PWD/build/stage"
```

Para uma instalação local com entrada no gerenciador de login:

```sh
npm install && npm run build # bundles every theme with the SDK and the apps
sudo make install PREFIX=/usr
```

On Debian 13 (see [`docs/VM-SETUP.md`](docs/VM-SETUP.md) for the full list of packages):
A instalação adiciona `lord-de-session`, os arquivos em `/usr/libexec/lord-de` e a sessão **Lord DE (experimental)**. Não habilita serviços nem substitui o gerenciador de login. Encerre a sessão atual e selecione essa entrada no login, ou execute `lord-de-session` em uma TTY local livre. Execute o desktop como seu usuário normal, **sem sudo**. O acesso a DRM e evdev passa por libseat com logind ou seatd.

Para verificar a inicialização sem monitor, dentro do checkout:

```sh
cd server
./build/lord-server --headless 800x600 --timeout 2
```

Esse modo não abre uma janela dentro do GNOME/KDE. `Ctrl+Alt+Backspace` encerra a sessão física; `Ctrl+Alt+F1` a `F10` solicita a troca de TTY ao provedor de sessão.

## RPM local

```sh
make -C server -j4 && make -C server test
sudo dnf install rpm-build
sh tools/desktop/dist.sh
mkdir -p build/rpmbuild/SOURCES
cp dist/lord-de-*.tar.gz build/rpmbuild/SOURCES/
rpmbuild -ba --define "_topdir $PWD/build/rpmbuild" packaging/rpm/lord-de.spec
```

Images: [`docs/ISO.md`](docs/ISO.md) (PC) and [`docs/RASPBERRY.md`](docs/RASPBERRY.md) (Raspberry Pi 5).
O arquivo fonte inclui os temas compilados a partir do lockfile; o build do RPM compila o C sem acessar a rede. É um pacote local experimental, ainda sem preparação para submissão aos repositórios oficiais do Fedora. O RPM usa a composição por CPU para manter suas dependências pequenas.

## Contributing and security
## Separação entre desktop e SO

- [`CONTRIBUTING.md`](CONTRIBUTING.md) and the [code of conduct](CODE_OF_CONDUCT.md).
- Found a vulnerability? Please read [`SECURITY.md`](SECURITY.md) and don't open a public issue.
- Bugs and ideas: [how to report](https://lordos.org/legal/issues/).
O perfil padrão `desktop` não compila o gerenciador Debian, o instalador do SO, o helper administrativo privilegiado, `lord-netd`, `lord-sessiond`, `lord-netperm` ou `lord-fand`. A loja administra aplicativos `.lpk` e oferece abrir o gerenciador de software da distribuição quando disponível. Pacotes RPM/DNF não são tratados como pacotes Debian.

## Support the project
Rede e VPN, usuários, SSH, ventoinhas, formatação de discos e outras operações administrativas do antigo helper ficam com o sistema hospedeiro. As páginas que ainda dependem dele têm funcionalidades limitadas. Áudio usa o protocolo PulseAudio, incluindo PipeWire; Bluetooth e outras integrações existentes continuam usando D-Bus.

LordOS is free and open source. If it makes your computer better, help us keep building it:
[lordos.org/#support](https://lordos.org/#support).
O código e os scripts de distribuição do upstream permanecem no repositório como legado, fora da instalação da DE. Para trabalhar explicitamente no perfil antigo: `make -C server PROFILE=os` e `LORD_PROFILE=os npm run build`. Esse perfil continua específico do LordOS/Debian e não foi convertido em uma distribuição Fedora.

## Made by iPERFEX
Veja [a arquitetura da extração e os próximos passos](docs/STANDALONE.md). A [documentação original](docs/README.md) descreve o LordOS upstream; seus comandos de ISO, instalação e administração não se aplicam automaticamente a este fork.

LordOS is developed by [iPERFEX](https://www.iperfex.com/?lang=en). Meet Lumo, the guardian of
LordOS, in the [brand guide](docs/LORDOS-BRAND.md). To work with us on LordOS (sponsorship,
collaborations, custom apps or support), see [lordos.org/about](https://lordos.org/about/).
## Estrutura

## License
- `server/`: compositor, motor gráfico, helpers de aplicativos e camada `src/platform/`.
- `runtime/`, `sdk/`, `themes/`, `apps/`: interface e aplicativos nativos.
- `tools/desktop/`: instalação, verificação e arquivo fonte para empacotamento.
- `packaging/desktop/`, `packaging/rpm/`: integração da sessão e pacote Fedora.
- `tools/iso/`, `tools/rpi/`, `packaging/debian/`: legado da distribuição original.

MIT for LordOS's code (see [`LICENSE`](LICENSE)). Each third-party component keeps its own
license (see [`THIRD_PARTY.md`](THIRD_PARTY.md) and [`docs/COMPLIANCE.md`](docs/COMPLIANCE.md)).
The LordOS name, logo and Lumo are covered by the [trademark policy](https://lordos.org/legal/trademark/).
## Origem e licenças

Copyright © 2026 [iPERFEX](https://www.iperfex.com/?lang=en). All rights reserved for the website, brand and content; the code is free software under the MIT license.
O código deriva do LordOS, desenvolvido pela iPERFEX. Créditos e avisos de copyright originais são preservados. Consulte [LICENSE](LICENSE) e [THIRD_PARTY.md](THIRD_PARTY.md) para o código e seus componentes. Este fork não é uma versão oficial do LordOS.
10 changes: 8 additions & 2 deletions apps/settings/General.jsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Settings → General (machine and software details) and Updates (Debian and LordOS).
import {
View, Text, Button, useTheme, useLocale, useSystemInfo, useServerStats, lordosVersion, screen, formatBytes, formatDuration, formatNumber,
admin, wm, LordOSLogo, LordOSWordmark, spacing, typeScale,
admin, wm, LordOSLogo, LordOSWordmark, spacing, typeScale, standaloneDesktop,
} from '@lordos/sdk';
import { useState, version as reactVersion } from 'react';
import { Stack, Section, ValueRow, Note, Message, Actions } from './ui.jsx';
Expand Down Expand Up @@ -58,6 +58,12 @@ export function Updates() {
const pkg = typeof lord.pkg !== 'undefined' && lord.pkg.available();
const ups = pkg ? lord.pkg.upgrades() : [];
const at = pkg ? lord.pkg.lastUpdate() : 0;
if (standaloneDesktop) return (
<Stack>
<Note>{tr('store.host.description')}</Note>
<Actions><Button primary label={tr('settings.updates.open')} onClick={() => wm.open('store', { args: { page: 'updates' } })} /></Actions>
</Stack>
);
const check = () => {
setBusy(true);
admin.run('pkg-update').then(() => setMsg({ ok: true, text: tr('settings.updates.checked') }), (e) => setMsg({ ok: false, text: e.message }))
Expand All @@ -74,7 +80,7 @@ export function Updates() {
<Button primary label={tr('settings.updates.open')} onClick={() => wm.open('store', { args: { page: 'updates' } })} />
</Actions>
<Message msg={msg} />
{!admin.available() && <Note tone="warn">{tr('settings.admin.unavailable')}</Note>}
{!admin.available() && <Note tone="warn">{tr(standaloneDesktop ? 'settings.host.adminUnavailable' : 'settings.admin.unavailable')}</Note>}
</Stack>
);
}
3 changes: 2 additions & 1 deletion apps/settings/Sharing.jsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { standaloneDesktop } from '@lordos/sdk';
// Settings → Sharing: remote desktop (lord-sessiond, docs/REMOTE.md) and remote login (SSH).
// Both are off by default; turning them on, choosing who can log in and viewing or cutting
// connections goes through the administration helper (remote-* and ssh-* actions). The SSH
Expand Down Expand Up @@ -300,7 +301,7 @@ export function SharingSettings() {
options={[['all', tr('settings.sharing.allUsers')], ['group', tr('settings.sharing.onlyGroup')]]} />
</SettingRow>
</Section>
{!isAdmin && <Note tone="warn">{tr('settings.admin.unavailable')}</Note>}
{!isAdmin && <Note tone="warn">{tr(standaloneDesktop ? 'settings.host.adminUnavailable' : 'settings.admin.unavailable')}</Note>}
{!st.installed && <Note tone="warn">{tr('settings.sharing.notInstalled')}</Note>}
<Message msg={msg} />
<AccessSection st={st} isAdmin={isAdmin} busy={busy} act={act} />
Expand Down
11 changes: 7 additions & 4 deletions apps/settings/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// keyboard, themes and session pages. The other pages are in their own files; all of them are built
// from ./ui.jsx (docs/DESIGN.md, "Settings").
import {
View, Text, Image, useTheme, useSettings, themes, session, keyboard, admin, languages, setLanguage, useLocale,
standaloneDesktop, View, Text, Image, useTheme, useSettings, themes, session, keyboard, admin, languages, setLanguage, useLocale,
reloadCatalogs, tOptional, statusText, fs, useStore, SidebarItem, Toggle, Button, TextInput, ScrollView, SearchField, Hairline, useSystemInfo, useAppWindow, useTrackpads,
spacing, typeScale, registerDockActions, hasTouchpad, findWallpaper, wallpaperThumb, WALLPAPER_CATEGORIES, wm,
} from '@lordos/sdk';
Expand Down Expand Up @@ -349,7 +349,7 @@ function LanguageRegion() {
</SettingRow>
<PackImport onDone={(text) => { reloadCatalogs(); setMsg({ ok: true, text }); }} />
</Section>
{!isAdmin && <Note tone="warn">{tr('settings.admin.unavailable')}</Note>}
{!isAdmin && <Note tone="warn">{tr(standaloneDesktop ? 'settings.host.adminUnavailable' : 'settings.admin.unavailable')}</Note>}
<AdminLog />
<Message msg={msg} />
</Stack>
Expand Down Expand Up @@ -528,7 +528,7 @@ const GROUPS = [
];
const SECTIONS = GROUPS.flat();
// Trackpad only if there is a touchpad (lord-sessiond lends them with the monitor)
const sectionShown = (id, hasPad) => id !== 'trackpad' || hasPad;
const sectionShown = (id, hasPad) => (id !== 'trackpad' || hasPad) && (!standaloneDesktop || !['sharing', 'users', 'cooling'].includes(id));

// The Dock's right-click menu lists every section, in the sidebar's order and with its names; one
// opens Settings on that page (sdk/dock.js, quick actions). Built from SECTIONS, so it never drifts.
Expand Down Expand Up @@ -575,7 +575,10 @@ export default function Settings() {
const { args } = useAppWindow();
const [section, setSectionState] = useState(lastSection);
const [query, setQuery] = useState('');
const setSection = (s) => { lastSection = s; setSectionState(s); };
const setSection = (s) => {
if (standaloneDesktop && ['sharing', 'users', 'cooling'].includes(s)) s = 'general';
lastSection = s; setSectionState(s);
};
useEffect(() => { if (args?.section && SECTIONS.some(([id]) => id === args.section)) setSection(args.section); }, [args?.nonce]);
const [, Body] = SECTIONS.find(([id]) => id === section) || SECTIONS[0];
const q = query.trim().toLowerCase();
Expand Down
22 changes: 22 additions & 0 deletions apps/store/host.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Host package management stays with the distribution; native .lpk apps stay here.
import { View, Text, Button, useTheme, useLocale, useLauncherApps, launchApp, spacing, typeScale } from '@lordos/sdk';

export function HostPackages() {
const th = useTheme();
const { t } = useLocale();
const apps = useLauncherApps();
const manager = apps.find((a) => a.kind === 'linux' && /^(org\.gnome\.Software|org\.kde\.discover|org\.kde\.plasma-discover|synaptic)$/.test(a.desktopId));
return (
<View style={{ gap: spacing.l }}>
<Text style={{ fontSize: typeScale.title, fontWeight: 600, color: th.text }}>{t('store.host.title')}</Text>
<Text style={{ fontSize: typeScale.body, lineHeight: 1.5, color: th.textDim }}>{t('store.host.description')}</Text>
{manager && <Button primary label={t('store.host.open')} onClick={() => launchApp(manager.id)} />}
</View>
);
}

export const useDebian = () => ({ upgrades: [], job: null, msg: null });
export const debian = {
Discover: HostPackages, Updates: HostPackages, Status: () => null,
canRemove: () => false,
};
Loading