- Nix 48.7%
- QML 40%
- Python 8.2%
- Shell 1.9%
- Go Template 1.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
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> |
||
| dev | ||
| docs | ||
| nix | ||
| shell | ||
| templates/default | ||
| .envrc | ||
| .gitignore | ||
| APPS.me.md | ||
| BLOCKS.me.md | ||
| DESIGN.me.md | ||
| flake.lock | ||
| flake.nix | ||
| IDEA.me.md | ||
| NOTES.md | ||
| PLAN.md | ||
| README.md | ||
| STYLE.me.md | ||
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]