Grant Custer

Feed  Index  Twitter


Towards a task-based operating system: a sketch built with Linux, NixOS, Hyprland, Node, React

My customized home dashboard

I’ve been working on building a task-focused operating system. Really it’s more like a presentational wrapper on top of a bunch of Linux tools. You can see the configuration at the repo, for now it should only be used as a reference.

The idea

The main idea is to have a separate workspace for each task. Workspaces are displayed on the home dashboard (accessed through Command+Tab). The workspace list is set-up similar to a command pallete: focused on being fast and keyboard-usable. Recently viewed spaces are at the top, typing filters them live, and hitting return selects the top one. You can create a new workspace directly from the filter input.

Currently workspaces themselves are pretty minimal. The workspace name is at the top left and the time at the top right. Application windows are tiled.

The workspace for writing this blog post

The goal is to stay focused on one task at a time. I’ve found just the step of having the task name in the bar to be surprisingly effective.

One piece that makes this work is that most of my applications are either terminals or browsers. I’m quite happy to open multiple new terminals and browsers for each workspace. This keeps the workspaces self-contained (no need to flip back to refer to something in the browser in another space, just open a new browser window).

The architecture

Why React

Mainly because it’s what I’m most familiar with and therefore can move the fastest and most surely in. There’s also a pattern of apps like Waybar adopting a subset of CSS for styling. Once I saw that and figured out the node.js to command-line piece, I thought why not just go all the way and get full access to HTML and CSS possibilities. My styling has stayed pretty minimalist so far, but there’s obviously the potential to go much wilder with it.

The main concerns are latency and performance. I don’t think performance is going to be hurt by keeping a few more web pages open. Latency I do feel a bit on clicks. I can’t imagine React is the bottle-neck there, though, and probably I can get better results by tweaking my websocket and shell-script set-up.

Displaying todos and screenshots

I show lists of todos and system ideas on the dashboard as well. These come from markdown files, I again use the websocket server to cat the file contents and then display those within React. I could/should use a markdown renderer, but my todo format is consistent enough I just parse it myself for now. I use inotify to watch for changes and update automatically. This seems like a really interesting pattern I’d like to experiment more with. Maybe make custom file watcher modules on the dashboard on-demand. In my case these files are also in my Obsidian vault, and since I have Obsidian sync I can get sync across my mobile devices too.

Screenshot display is similar but I watch a directory. The ability to display images (or videos) exactly like I want them is a really nice feature of doing this with HTML, and something I’ll continue to explore.

Future plans

Let me know what you think

I’m interested to hear from anyone doing similar experiments or what you would want if you were had your own customizable operating system.

More writing

Grant Custer is a designer-programmer interested in alternative interfaces.

You can see work and inspiration in progress on my Feed and my alternative interface experiments on Constraint Systems. I’m happy to talk on Twitter, email: grantcuster at gmail dot com, or Mastodon. You can see a full list of projects on my Index.