Things by Neil

No cookies, no ads, no tracking, like the web used to be.

I'm an independent author, and I recently started getting into Linux after decades as a Windows-only person. This means I have need for software to write my books that runs on Windows and Linux. Currently, I use Scrivener, which is fine, but doesn't work on Linux. There are things that do, like novelWriter, which is open source, loaded with features and under active development. Indeed, for my purposes, it feels like overkill almost, a bit like Scrivener has always felt.

There are also online editors like Atticus, although this is relatively expensive and seems to use the troublesome lifetime pricing structure where you only pay once and have access forever. This, of course, requires that they recruit new users consistently to pay for the existing ones, and that makes me twitchy.

What I'm looking for, then, is simplicity and open source. I didn't find exactly what I wanted, so of course I'm now making it myself.

Introducing Plotwise Writer.

A screenshot of Plotwise Writer

It's early days, but my goal is to have everything right there in the toolbar and to magic away as much complexity as I can while still allowing customisation. It will also be free and open source. The MVP feature set looks like this:

  • Nested customisable folder structure
  • Always saved; never lose anything
  • Version history on documents
  • Simple export to PDF or EPUB3
  • Writing statistics, word count targets, etc
  • Customisable but with useful defaults
  • Light and dark themes
  • No AI nonsense

Other formats and features will come in time, as will things like importing from other software, and spell check, which I'm currently assessing.

I'm hoping to start releasing some alpha versions in the coming months.

Big Tech. I have, at times, been something of a fanboy of Microsoft, Google, and even Facebook. But as their offerings became enshittified, I began to lose faith in technology as a whole when what I should have been doing was looking elsewhere.

And then Donald Trump won a second term as US president, and these companies started falling over themselves to appease the tangerine tyrant. This was very much a wake up call for me. My priorities shifted. I started to look elsewhere.

I have quite a few things I need to replace, and I'll try to document what I do and update this post.

šŸ”µ Windows Server and Active Directory Domain (Linux and Samba) šŸ”µ Windows in general šŸ”µ Umbraco šŸ”µ Google Chrome (moved to Vivaldi) šŸ”µ Android

Services

šŸ”µ Microsoft Azure (mainly for DNS, mostly moved to Scaleway otherwise) šŸ”µ Microsoft 365 (email and OneDrive primarily. My OneDrive replacement is SyncThing) šŸ”µ Facebook (deactivated) šŸ”µ Instagram (barely use, but have a valued community there) šŸ”µ Threads (deleted account) šŸ”µ WhatsApp (don't use it but have an account) šŸ”µ GitHub (moved to self-hosted Gitea) šŸ”µ Let's Encrypt (this is a low priority, but it is based in the US, and there is a European provider) šŸ”µ Amazon Prime (will not renew) šŸ”µ Amazon KDP (a necessary evil for the moment) šŸ”µ Squarespace for domains (mostly moved to Scaleway) šŸ”µ Google Maps (including location tracking) šŸ”µ Google/OneDrive Photos šŸ”µ Netflix/Disney+/Amazon Prime Video (Jellyfin) šŸ”µ Audible (Audiobookshelf) šŸ”µ Kindle (unsure of my alternative, maybe Kavita)

...you say, miffed. You're right. WriteFreely, which I use to run this site, does indeed set a single cookie by default.

ā€œBut your site's tagline says no cookies!ā€

Again, true.

ā€œBuh?ā€

You're wondering how I can claim that? Check your browser's debugger. No cookies, right?

screenshot of librewolf's debugger showing no cookies on nbullock.uk

I'm reverse proxying this site through nginx, and stripping out the one cookie that WriteFreely typically sets (wfu) on all public endpoints. It's true that I allow the cookie on the admin pages, but I kind of have to in order to be able to log in. So as long as you don't go to the login page, you will receive no cookies.

Even if you were to get the cookie, it's not exactly nefarious, but I don't actually need it for anything I'm doing here, so this is really just a proof of concept.

For the curious amongst you, the nginx config (excluding irrelevant stuff) looks like this:

location ~ ^/(login|admin|me|auth) {
    proxy_pass http://[redacted internal url];
}

location / {
    proxy_pass       http://[redacted internal url];
    proxy_hide_header Set-Cookie;
}

I recently decided I wanted to replace my aging Asus router which last had an update many years ago. Against a backdrop of the developing new world order, I wanted something that I built and controlled, at least as much as is reasonably possible, so I opted for a Raspberry Pi based router using OpenWrt.

The Pi only has one ethernet port, of course, and rather than go for a USB solution to this problem, I instead bought this:

a raspberry pi case which adds an extra ethernet port

The shopping list:

You'll also need an SD card or other storage solution, but I already had one.

The case is pretty cool, and very easy to set up. It's just a case of putting the Pi inside along with the extra boards that come with the case. One of these is the additional ethernet port while the other extends the HDMI, power and UART connections to the front and back of the case.

everything you receive with the raspberry pi case

Connect it all up and then you can turn your attention to the software and drivers. It's at this point I logged into the web interface and set up everything LAN related, like the IP address and so on. I won't cover that as it's fairly simple.

One thing I will mention is that you'll need 192.168.1.1 to be unused, as this is the default OpenWrt IP address. If it isn't free, the only option I had at the time was to use VirtualBox on my Windows laptop with USB passthrough, put the OpenWrt SD card into my laptop and edit /etc/config/network to change the IP.

Next, you have to turn on PCIe. You just need to edit config.txt in the FAT32 boot partition of your OpenWrt SD card, then add the following line.

dtparam=pciex1

So far, so good. If you boot the router and then SSH in, you can run the following:

> opkg update && opkg install pciutils
> lspci

0000:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries BCM2712 PCIe Bridge (rev 21)
0000:01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8211/8411 PCI Express Gigabit Ethernet Controller (rev 15)
0001:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries BCM2712 PCIe Bridge (rev 21)
0001:01:00.0 Ethernet controller: Raspberry Pi Ltd RP1 PCIe 2.0 South Bridge

The second line here tells you that the PCIe ethernet controller has been detected, so next you need to install drivers for it.

> opkg install kmod‑r8169

That should do it. Rebooting may or may not be necessary at this point, I'm not sure, but the PCIe ethernet port should now work. You can verify by running:

>ip link show eth1
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 2e:8a:e1:fc:5a:bb brd ff:ff:ff:ff:ff:ff

At this stage in my setup process, I hadn't actually connected a cable, so the interface showed as down. In order to configure OpenWrt to use eth1 as the wan interface, you can run the following:

> uci set network.wan.device='eth1'
> uci set network.wan.proto='dhcp'
> uci commit network
> /etc/init.d/network restart

For me and my ISP, DHCP was the right way to go. If you use PPPoE or something else, you will need to do a little extra work here, although from what I understand it's only a few extra commands to set the PPPoE user/pass values.

If you want to verify the firewall isn't going to let anyone in, you can do this:

> uci show firewall | grep -A6 "@zone.*name='wan'"
firewall.@zone[1].name='wan'
firewall.@zone[1].network='wan' 'wan6'
firewall.@zone[1].input='REJECT'
firewall.@zone[1].output='ACCEPT'
firewall.@zone[1].forward='REJECT'
firewall.@zone[1].masq='1'
firewall.@zone[1].mtu_fix='1'

If you don't see the masq and mtu_fix items (as I didn't), you can use the following:

> uci set firewall.@zone[1].masq='1'
> uci set firewall.@zone[1].mtu_fix='1'

And that's it! Connect your internet connection to eth1 and your LAN to eth0 and you've got yourself a router.