The Liminix project is creating a Nix-based OpenWrt-style embedded Linux system for configuring consumer wifi routers. We use the Nix language for congruent configuration management, and packages from the Nix package system.

Planned features include

  • seamless management of configuration and secrets across a network of Liminix devices

  • robust dependency-based service/process management so that a device can respond usefully when hardware or network connectivity changes.

To receive occasional updates about Liminix you can join the announce@liminix.org mailing list

Recent news

  • Trigger happy

    The Turris Omnia has been running “the internet” for my family for most of a month (uptime says 27 days) and after some initial teething trouble I have had no complaints.

  • Omnia dicta fortiora si dicta Latina

    Most of my Liminix time in January I spent working on the Turris Omnia installer that I described last month (last year, whatever) and now it works. There are some instructions and I’ve made a video in which I demonstrate what should happen if you follow them. What’s kind of neat about doing it this way is that we are able to use the Turris Schnapps system in Liminix for snapshot and rollback support.

  • Yule boot

    The Turris Omnia basically works. It looks a lot more like a grown-up computer than the other devices we’ve previously seen - for example, the storage is MMC not raw flash (so we can use block filesystems like btrfs, ext4fs etc), and the bus is PCI (meaning it’s enumerable, we don’t need to put the network devices in the device tree). The WiFi chipsets are both ones we’ve seen before. All in all, the port has been quite smooth so far.

  • Arms length

    Since the last update I have added UBIFS for the Belkin RT3200 (and other devices with larger flash chips), and started an Arm 32 bit port which runs on QEMU and boots (though doesn’t yet do much after booting) on the Turris Omnia. But then I got a little bit sidetracked into improving (read: replacing) the story for upgrading a router once it has Liminix running. (Blatting a new image onto the flash while the system is running from that same flash device is not a good idea. The best case scenario is that the flash write succeeds and then the system wedges solid, but I can’t see any guarantee it wouldn’t crash earlier)

  • Arms race

    This week: I have landed the WIP port for the Belkin RT3200. It’s not finished - nothing flashable yet - but I have cleaned up sufficient of the initial hacks that it can go to main without breaking the MIPS machines.

  • To Arms

    Progress on Liminix ARM support. The device I’m starting with is the Belkin RT3200 (also known as Linksys E8450) which seems to be a reasonably featureful piece of kit, and which I snagged for a very good price on the Bay of E.

  • updoc

    Q: What’s updoc?

  • Longer than expected

    Given that it’s a month since the last update, one might reasonably - and correctly - surmise that chopping around modules and services is taking longer to sort out than I’d anticipated it would.

  • Full service wash

    Once upon a time I wrote

  • Time to tidy up

    Last week I wrote:

  • We didn't start the fire(wall)

    tl;dr:

  • nftables or fn stable

    Hadn’t realised it had been so long since I last updated this, but progress has been slow lately.

  • Update update

    This week^Wfortnight I’ve added a liminix-rebuild command. It uses min-copy-closure to copy the systemConfiguration closure onto the device, then copies the activate binary (and some other bits) into /persist. Then it reboots the device, and the next time it comes up it will run the new activate.

  • Copying copy-closure

    Shortly after all the work to reduce system closure size last time, I tried adding the necessary packages to support nix-copy-closure and saw it start building a complete C++ system with Boost. My fears that this would lead to quite a large increase in the system size were, it turned out, entirely founded.

  • Erase and rewind

    Late update this week, and it’s little more than “hey, I’m still alive”. I’ve been a bit under the weather and spending my discretionary computer time on playing GP Bikes instead of getting anything useful done.

  • Some assembly required

    tl;dr Premature optimization in the rootfs of my emu

  • Writes of way

    It ought to work, anyway. Next week maybe I can talk about it in the past tense and not the future conditional.

  • Nothing to write /home about

    This week in Liminix: a change in the plan. Much to think about, nothing to show

  • We've got mail

    As you’ll see if you’re reading this on www.liminix.org (but not if you’re using the RSS feed) we’re now on version 0.2 of the web site. I’ve starting to add a bit more structure beyond the blog entries and would draw your attention particularly to:

  • Side quest

    This week: I made a video, then I went on a tangent.

  • MT vessels: make some noise

    tl;dr MT300N-v2 and MT300A are both implemented

  • Ready for action

    Last week I said I was going to spend this week on fixing the 5GHz wireless suport and then put the GL-AR750 away and start working on some other device. Some of that happened …

  • Order, Order

    tl;dr for this week: I can browse the internet on an Android phone connected by wifi to my Liminix test device :-)

  • Tunnel Vision

    This week in Liminix: am happy to report that the rewritten PHRAM/tftpboot stuff almost worked first time, and the delta between first and second time was just a simple syntax error. The GL-AR750 boots :-)

  • on multiple fronts

    This week I have been dabbling on multiple fronts.

  • Taking stock

    I am pleased and proud to announce that Liminix has been awarded a grant from the NGI Zero Entrust fund administered by the NLnet Foundation - the overall objective being to turn it from something that runs my home internet into something that could run other people’s (yours? if you’re reading this, you’re probably the target audience) home/small office internet as well.

subscribe via RSS