No description
  • Nix 48.7%
  • QML 40%
  • Python 8.2%
  • Shell 1.9%
  • Go Template 1.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Arne Skaar Fismen 6ffe0240e0 Put fullscreen on Mod+F, and stop ghostty taking Ctrl+Enter
Full width moves to Mod+Shift+F. ghostty's Linux default binds Ctrl+Enter
to toggle_fullscreen, which swallowed the key from programs inside it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 22:48:49 +02:00
dev Read the shell's tunables from a fixed path, and a live file over it 2026-09-17 12:59:45 +02:00
docs Become fjordxy, and make the terminal part of the desktop 2026-08-26 22:49:50 +02:00
nix Put fullscreen on Mod+F, and stop ghostty taking Ctrl+Enter 2026-10-08 22:48:49 +02:00
shell Cap one link's bandwidth while every screen is off 2026-10-08 14:10:27 +02:00
templates/default Read fjordxy.toml into the option tree at rebuild 2026-09-17 12:42:38 +02:00
.envrc M1: Quickshell scaffold, niri event client, and the status-space guard 2026-08-16 08:43:20 +02:00
.gitignore Write the on-ramp, and give the documents a front door 2026-08-22 14:08:37 +02:00
APPS.me.md Specify what an application is 2026-08-30 14:23:09 +02:00
BLOCKS.me.md Make a drawer page an accordion of blocks 2026-08-30 08:40:39 +02:00
DESIGN.me.md Adopt Omarchy's theme format, with one template as the mapping 2026-09-17 12:45:52 +02:00
flake.lock Move fjordxy's own nixpkgs past the journald rename 2026-09-04 19:24:35 +02:00
flake.nix Read fjordxy.toml into the option tree at rebuild 2026-09-17 12:42:38 +02:00
IDEA.me.md Become fjordxy, and make the terminal part of the desktop 2026-08-26 22:49:50 +02:00
NOTES.md Put fjordxy's mkDefaults on the leaves, not the containers 2026-09-17 00:07:12 +02:00
PLAN.md Drop journald sizing from the system profile 2026-09-06 21:45:58 +02:00
README.md Drop journald sizing from the system profile 2026-09-06 21:45:58 +02:00
STYLE.me.md Cap one link's bandwidth while every screen is off 2026-10-08 14:10:27 +02:00

Fjordxy

[one or two sentences: what it is] [built on NixOS, compositor is niri — https://github.com/YaLTeR/niri] [the xy is niri's two axes: workspaces stack along y, windows scroll along x]

[from IDEA.me.md, if you still mean it: sensible defaults, a simple starting point, opinionated, open so you can tweak it once you know your preferences]

What we believe

[less chrome around windows] [text interfaces are first class] [progressive web apps should work well] [colour is rare, so what needs noticing gets it] [looks like a well-set terminal: IBM Plex Mono, dense readouts, straight value edge] [NixOS gives: atomic updates, every version a generation you can boot into, without writing a NixOS config to get a desktop]

Installing

[the ISO: boots straight into the desktop, carries the installer]

nix build git+https://code.bas.es/bases/fjord.git#iso
sudo dd if=result/iso/*.iso of=/dev/sdX bs=4M status=progress oflag=sync

[boot it, join wifi from the drawer, then:]

sudo fjordxy-setup

[asks for a disk, a hostname, an account, a timezone and a disk passphrase] [partitions GPT + LUKS + btrfs, installs, asks you to set the account password] [fjordxy-setup --oem installs without an account, for handing the machine on]

[by hand, from any NixOS installer: partition and mount, then]

nixos-generate-config --root /mnt
cd /mnt/etc/nixos
nix flake init -t git+https://code.bas.es/bases/fjord.git

[writes five files; edit three names at the top of flake.nix] [disko.nix is an empty { } by hand and does nothing]

nixos-install --flake /mnt/etc/nixos#<hostname>

[account has no password until you set one: nixos-enter, then passwd ] [reboot, log in, press Mod+G] [Mod+Shift+/ lists every key]

What you get

[a 32px rail down the left of every workspace, and a drawer that slides out from behind it] [rail: dot per workspace, battery column filling from the bottom, wifi bars, two-row clock. You glance at it; you never drive it]

[the drawer is 380 logical px wide and holds two pages:]

home the overview: the clock, what is on, what is unread, and the controls
launcher type to filter applications, Enter to launch

[Mod+G opens the drawer on home, Mod+Space on the launcher; pressing the same key again closes it. Ctrl+H / Ctrl+L slide between the two pages] [five of home's rows open: power, network, bluetooth, tailnet, audio. j/k moves, Enter opens and acts, Escape closes] [home renders each subject in brief; the full rendering the same definition carries is what a dedicated column would have shown]

[the drawer takes the keyboard while it is out and gives it back when it closes, and nothing on the desktop moves: the rail keeps reserving its 32px and the drawer is drawn over your windows, not carved out of them]

[underneath: niri configured whole — binds, layout, animations, focus ring colour] [plus: lock screen, idle handling, notifications, the launcher drawer, clipboard history, greeter, portals, audio, dark GTK and Qt, firewall, weekly garbage collection, bounded journal]

What stays yours

[hardware-configuration.nix and the disk layout] [boot loader and timezone] [outputs, keyboard, touchpad] [username and hostname — the two values Fjordxy refuses to guess, so leaving either unset is an evaluation error] [the applications you want] [anything you decide we got wrong]

[every default is a mkDefault — when a distro writes most of your config, a default you cannot override is a bug]

Changing our mind

[no invented names for things NixOS already has, so disagreeing means setting the ordinary option]

# the look
programs.niri.settings.layout.gaps = 8;
programs.fjordxy.theme.fontSize = 15;   # our type was chosen on a HiDPI panel

# one key, since binds are an attrset and yours merges with ours
programs.niri.settings.binds."Mod+T".action.spawn = "alacritty";

# system policy, with no new name to learn
nix.gc.dates = "daily";
console.keyMap = "no";

# reaching the machine, off by default and correct when you switch it on
programs.fjordxy.remote.ssh.enable = true;        # key-only, no root, opens 22
programs.fjordxy.remote.tailscale.enable = true;  # direct, not relayed
programs.fjordxy.remote.mdns.enable = true;       # <hostname>.local resolves

# our taste dropped entirely, keeping only what the shell needs
programs.fjordxy.niri.defaults = false;

[the split: whether a machine listens on the network is your call; what a correct sshd looks like is ours. So ssh is off until asked for, and hardened once you ask]

Declaring an application

programs.fjordxy.workspaces = [ "web" ];

programs.fjordxy.apps.browser = {
  package = pkgs.firefox;
  appId = "^firefox$";
  workspace = "web";
  bind = "Mod+B";
};

[one declaration gives five things that cannot disagree: installs the package, writes the niri window rule, creates the workspace, binds the key, adds the launcher entry] [by hand that is four files that have to agree, and every way of getting it wrong is silent: a mistyped app-id matches nothing, an undeclared workspace makes the rule a no-op] [here the workspace name is checked when the config evaluates]

Already running NixOS

[no reinstall needed — the profiles are ordinary NixOS modules, take a slice]

fjordxy.nixosModules.default

programs.fjordxy.enable = true;          # the shell
programs.fjordxy.desktop.enable = true;  # compositor, greeter, portals, audio
programs.fjordxy.system.enable = true;   # nix policy, the login, networking
programs.fjordxy.identity.username = "ada";
programs.fjordxy.identity.hostName = "kestrel";

[whole option surface is on the system side] [the home-manager module declares nothing and exists for the files it writes, so home-manager has to run as a NixOS module — niri's own settings need that too]

What it costs

[nixos-unstable — Quickshell 0.3.0 is not in stable] [niri only, not portable to another compositor, not trying to be] [agenda has no data source, so home's next row says so rather than showing a clear day. Everything else on home reads real data] [the drawer is down to home and the launcher — notifications, system, agenda and settings were columns on the old status space and are not pages yet; their blocks still exist, rendered brief on home] [pages are not configurable yet: home is an ordered list of block names, which is the shape a consumer would write, but the list still lives in QML] [no releases — no tags, no stable channel, pinning means pinning a commit] [no screen reader — niri's stock config binds one, we do not ship orca]

Where things are

Design what Fjordxy decides for you, and where the line is
Style guide the visual language
Apps installing, updating, and choosing default apps — a sketch
nix build .#docs the documentation site, options generated from the module
PLAN.md milestones, kept in the repository
NOTES.md the working log, kept in the repository

Status

[working: compositor and its configuration, the rail, the drawer with home and launcher pages, notifications, clipboard, lock and idle, greeter, portals, audio, GTK/Qt theming, programs.fjordxy.apps, the system profile, remote access] [working, added: the live ISO (nix build .#iso) and fjordxy-setup, the installer — pick a disk, answer the identity questions, get an encrypted machine with its own flake in /etc/nixos] [outstanding: the apps surface (install via nix profile, an updates page, default apps for browser/terminal/email/ai — see APPS.me.md), agenda's data source, more drawer pages, configurable pages, multi-output, the installer's OEM first-boot resume, releases and an update command, a settings surface that writes back] [developed on two machines, installed on a third that runs nothing else]

The name

[everything used to be called fjord; options were programs.fjord.] [they still work and warn once; rename to programs.fjordxy. when it suits]