(142 items)
Obsidian is a note/knowledge management tool Iāve used a fair amount in the past (before moving to nb). Below I log some considerations I dealt with whilst using Obsidian. Self-deleting files Wh...
A collection of āthingsā, software and systems I use on a frequent or daily basis. I enjoy using open source, self-hosted, and independent software where possible. I like the reliability a...
Whilst browsing my GitHub home feed a little while back (not something Iām in a habit of doing, generally), I stumbled upon the command line journaling tool jrnl. I thought it looked interesting... (5 minute read)
As of September 2024 I use nb as my primary note-taking and knowledge management program. Install On a Mac, it can be installed from Homebrew: brew install nb. Set nb directory I sync my nb documents ...
Many moons ago I would write web applications using technologies like PHP or Python to directly serve web content ā often using templating engines to more easily handle data display. These apps ... (8 minute read)
A few weeks back (as of 2024-09-01) I posted about a tool called jrnl on Mastodon. The post got a fair amount of engagement and discussion, and Iāve also given it a go over the past couple of we...
If youāve followed my blog or other notes, youāll be well aware of my extensive use of Tailscale for nearly everything ā securing access to remote servers and for connecting to servi...
Restic has been my go-to backup tool for many years, and Iāve used it for a wide range of workloads ā including for managing filesystem, Postgres, Photoprism and Vaultwarden backups. At th... (3 minute read)
I self-host a Vaultwarden instance to manage my usernames, passwords, two-factor codes, and other details for my accounts everywhere. Standard Bitwarden clients (including browser extensions and mobil...
Iāve switched from managed photo providers (such as Apple or Google photos) to a self-hosted Photoprism instance. This note documents my setup. I use Linode for this, and you can get a free $100...
I subscribe to a small number of podcasts. I usually listen to them when at the gym or out walking, and so if I subscribe to too many I just canāt get through them all each week! That said, I&rs...
The tempting approach is just to use a publicly accessible bucket in āwebsite modeā for a website (since the website itself will also be public), and then use Cloudfront with the bucket&rs...
This is a reference quick-start note for deploying PostgreSQL via Docker, and with working self-signed TLS. 1. Generate keys for TLS E.g. with one year expiry: mkdir postgres-certs && cd postg...
This is a reference quick-start note for deploying MongoDB via Docker, and with working self-signed TLS. Note: This setup does not yet consider replica sets. Coming soonā¦ 1. Generate keys for T...
A scratchpad of links. Technology Keep a Changelog - Donāt let your friends dump git logs into changelogs. ChangeDetection.io - detect changes to websites ProtoSchool - Interactive tutorials on decent...
My personal website is generated using Hugo, which allows me to write nearly all of the actual content itself in plain markdown files. I also maintain a Gemini capsule (hosted at gemini://wilw.capsule... (2 minute read)
Some of my personal projects are beginning to get larger and more complicated, often involving different front-ends and services that all need to be separately built and deployed. Managing all of thes... (2 minute read)
As well as serving content from a storage zone, Bunny CDN can also serve from other origins. For example, S3-compatible storage solutions. For example, this website is stored on Linode Object Storage,...
I use Woodpecker CI to automate my personal CI/CD processes. This note documents my setup. Create a docker-compose.yml and bring the service up (notes on environment below): version: '3' servi...
Bunny CDN provides a cost-effective, easy-to-use, and highly performant service for delivering web content. I currently use it to serve this website, as well as a few other systems. Pull zones and sto...
I self-host a number of services - Nextcloud, FreshRSS, PhotoPrism etc. - at home on a Raspberry Pi. Attached to this Pi is a large SSD to hold the service data and configuration, and all of this is p... (3 minute read)
I run a number of services on my own machines and VPSs, and for each system I ensure there are appropriate backups in place. Backup target I usually use Backblaze B2 as a backup solution due to its lo...
Iām interested in being able to look after my own data, as much as possible. I try to ensure that this is at least (almost) as convenient as commercial where I can (and so there is probably much...
My notes are kept using Joplin. I use Joplin server to keep all of my devices in-sync. Below is a docker-compose.yml I use to run the server. version: '3' services: db: image: postgres:13 volu...
macOS window management Every Mac user seems to have a different way of managing their open applications and windows. Some people prefer to view each window in āfullā mode, in which they t... (3 minute read)
I have a small fleet of Raspberry Pis (mostly the Pi 4 Model B), which I use at home for various tasks. They are all firewalled off and are reachable via Tailscale. A small number of the services they...
This note documents my setup for building a sane-ish (for me) software environment on macOS for work, development, and life. Core tasks Rename the Mac (Settings -> General -> Name) Add home dire...
Donations I make To free, open-source, hobby services and products. Product/service Link Donation FreshRSS Liberapay Ā£3 / month Fosstodon Patreon Ā£4 / month Photoprism Patreon Ā£2 / month Joplin Patreo...
A history of media storage solutions Back in 2021 I blogged about how and why I wanted to switch from Google Photos as a storage solution (and source of truth) for my lifeās photo and video libr... (5 minute read)
2FAuth is a self-hostable web service for managing two-factor authentication tokens. It has a nice, clean interface, is responsive (so it can be simply added to the homescreen on iOS), and has various...
Update 2024-09-01: I have since written a note on Tailscale Sidecars which provides a more elegant solution to this problem. I have left this post here for posterity. HTTPS on Tailscale Tailscale&rsqu... (4 minute read)
The Bear notes app has been my go-to notes app for Mac, iPhone, and iPad for some time now. Itās got a great UX, a customisable UI, and is one of those apps that feels like a (clichĆ©d) āde... (3 minute read)
s3cmd is an excellent tool for interacting with S3-compatible storage solutions (Amazon S3, Backblaze B2, Linode Object Storage, etc.) via the command line. I personally find it easier to use and more...
Gitea is a fantastic GitHub-like service for git remotes and for viewing code and git projects via a web-browser. One can join existing instances (such as Codeberg), or self-host it. I self-host a Git...
For sensitive data storage in the cloud, I will usually provision a separate volume, encrypt it, and then use this as the volume mapper for containerised services. Creating and attaching a volume I us...
I use Nextcloud as an alternative to Google Drive or iCloud. I self-host it on a VPS or Raspberry Pi and make it available only within my Tailscale network so that it is only accessible to my own auth...
When browsing Twitter, I use a self-hosted Nitter instance. Nitter allows you to browse Twitter using a more privacy-respecting front-end. To run Nitter, create a docker-compose.yml: version: "3&#...
When browsing Reddit, I use a self-hosted Teddit instance. Teddit allows you to view Reddit using a nicer and more privacy-respecting front-end. To run Teddit, create a docker-compose.yml: version: &#...
For managing and consuming RSS feeds, I use FreshRSS. To run a FreshRSS instance, create a docker-compose.yml file: version: "3" services: freshrss: image: freshrss/freshrss environment: - ...
Most of my personal services I run within my Tailscale network, and so I do not tend to bother with HTTPS (since provisioning TLS certificates for multiple services running on a single host via Tailsc...
I use Umami for analytics on this website and a few other services that I run. I self-host Umami using Docker. To start, create a docker-compose.yml: version: '3' services: umami: image: ghcr....
Alpine Linux ships with several BusyBox utilities, including many day-to-day shell commands. One such example is the unzip tool for extracting ZIP files. Recently, when unzipping a large archive on Al...
I use a self-hosted Monica instance to keep on top of birthdays and other useful/interesting notes about friends and family. This note documents my setup. Create a docker-compose.yml file: version: &#...
GatsbyJS For several years Iāve been using GatsbyJS to generate the static site content for this website. Gatsby is a great tool and produces blazing-fast websites through the use of an interest... (6 minute read)
HMRCās Making Tax Digital Making Tax Digital (MTD) is part of the UK Governmentās plan for modernising the tax system for both businesses and individuals. For years, HMRC (the Government&r... (3 minute read)
Since getting a Magic Keyboard for my iPad Pro, Iāve been using the iPad for many areas of work for which before I would have needed a laptop. In fact, last week I was able to use the iPad full-... (6 minute read)
Over the past couple of years I have been intrigued (and sort of excited) about the ideas behind plain text accounting. To be excited about accounting is probably unusual but I love its simplicity and...
Earlier this week I needed to make some changes and re-deploy an old Vue app. I hadnāt touched the codebase in over a year, and my experience with the rate of change in the front-end web space m... (3 minute read)
If youāre a current follower of this blog then you may already know that Iām a bit of a fan of using plain text accounting for managing finances. I mainly use the Ledger text file format a... (7 minute read)
Iām not a designer, so I find it useful to take inspiration from others when building software. Illustrations Ira Design for illustrations unDraw - A great collection of open-source illustration...
Blog by mail A service by which users can write, submit and update a blog via email. For example, use the subject line to indicate a path (for a webpage) or blog post ID Use send date as post date? Or...
I often talk about self-hosting on this blog, and Iām certainly a big fan of being able to control my own data and systems wherever possible (and feasible). Iāve recently switched from usi... (7 minute read)
If youāve ever run your own Nextcloud before, you may have noticed screens like the following in your instanceās settings pages. The messages advise a number of maintenance procedures to h... (2 minute read)
I recently signed the web0 manifesto, which embodies many of the values I consider to be important when it comes to technology - and the web in particular. web0 is the decentralised webā¦ web0 i... (8 minute read)
š This is post 100 in my attempt at the #100DaysToOffload challenge! For a couple of years I have been writing mobile apps using the Flutter framework, having previously been a React Native advocate. ... (6 minute read)
For as long as Iāve been using Matrix Iāve hosted my own homeserver on my own VPS and at my own domain. Why I chose to move I previously wrote about how I self-host my homeserver with the ... (4 minute read)
Some people may remember my quest a few months back to find a good alternative to Google Photos for image storage and backup. At the time, I talked about Piwigo, Mega and pCloud as potential candidate... (7 minute read)
Most applications include some sort of outbound transactional email as part of their normal function. These email messages could be to support account-level features (such as password-resets) or to no... (6 minute read)
I maintain a small number of projects in my spare time. The amount of time I get to work on and maintain these varies depending on my other workloads. The projects were never designed to be a means of... (1 minute read)
A while ago I posted about how I back-up my personal servers to Backblaze B2. That approach involved adding all of the files and directories into a single compressed archive and sending this up to an ... (5 minute read)
From the hills of Duskās End to the small alleys of Main Street, you feel drawn to the lights of this vibrant metropolis in an uncharted internet territory. The sign reads āNightfall&rdquo... (2 minute read)
Iāve really enjoyed my recent discovery of a couple of traditional-style webzines. Webzines (sometimes referred to as online magazines, or - in this instance - simply āzinesā) are a ... (1 minute read)
Iāve recently been reminiscing about the āoldā days of the web. They felt much more like expressions of personality and creativity. These days, most people have social media accounts... (2 minute read)
If you run a service that accepts file uploads from users, and then subsequent re-download by other users (such as images), then your service is potentially at risk of becoming a system for distributi... (5 minute read)
Background Iāve recently noticed (and read) more and more posts discussing *BSD systems. Creations like the new (and excellent) OpenBSD Webzine and blogs (such as Rubenerdās and Solene&rsq... (5 minute read)
Another podcast I frequently listen to likely needs no introduction of its own. The This Week in Tech (or just āTWiTā) networkās flagship podcast - also called TWiT - must be one of ... (1 minute read)
Last week I gave a talk at the Bitcoin Association BSV Meet-up for Wales, hosted by Tramshed Tech in Cardiff. Before learning about this meetup, I had not heard of BSV - either from a technology or cu... (1 minute read)
A few years ago I was in the position of needing a solution to backup and sync dotfiles (configuration files for various pieces of software) across my machines. Specifically, I had Mac computers and L... (2 minute read)
Itās been a few weeks since my last post about the Pinephone. Since then I have been playing further with a different graphical shell and have been trying out new applications. In that previous ... (3 minute read)
For many developers, the notion of adding accessibility features - such as image alt text attributes to web page images and integrations with host usability enhancements, such as screen-zoom and text-... (3 minute read)
I was performing a standard system upgrade on an Arch server this morning and received the following messages (maintainer details redacted): $ sudo pacman -Syyu ... # Download of packages (159/159) ch... (1 minute read)
The need for notifications I self-host several services on various servers - for both some professional and personal uses. I use automated backup scripts to periodically sync data to Backblaze (which ... (4 minute read)
Another project I try to maintain (when I can!) is SSO Tools. This is a simple web service that aims to help developers test their own servicesā single sign-on (SSO) functionality. The motivatio... (1 minute read)
The problem with image uploads Many services - including web and mobile apps - allow for their users to upload imagery. This could be to enable users to upload an avatar image or perhaps create a gall... (7 minute read)
Adding theming and the choice between ālightā and ādarkā modes to your website can enhance your siteās accessibility and make it feel more consistent with the host operat... (8 minute read)
For several years Iāve been a user of Goodreads. Itās a very popular platform, and I primarily use it for keeping track of the books Iāve read, for receiving suggestions about new bo... (2 minute read)
I donāt tend to talk much about the projects Iām working on, but thought this would be a good opportunity to write a post about one such project - Treadl. Treadl is a web app (and more rec... (2 minute read)
Back in April, I bought a Pinephone. I used the phone quite consistently for the first few weeks and I meant to write an update here a couple of months back, but work (and other things) got in the way... (4 minute read)
Some people have complex development processes and flows - making use of tools such as heavy editors and IDEs, Docker for running and building locally in development, or even develop entirely remotely... (2 minute read)
Providing code snippets on your website or blog can be a great way to convey meaning for technical concepts. Using the HTML pre tag can help provide structure to your listings, in terms of spacing and... (2 minute read)
The Gemini protocol has gathered even more momentum in the few months since I last posted about it. Its popularity is largely driven by its privacy-focused and content-oriented design. It doesnā... (2 minute read)
I listen to a number of podcasts each week. One of these is ATP (Accidental Tech Podcast). This is one of my favourite weekly podcasts. Itās humurous and full of cutting-edge discussion from the... (1 minute read)
Many web apps have support for uploading video files. Whether itās a media-focused platform (such as a video sharing service) or just offering users a chance to add vlogs to their profile - vide... (2 minute read)
I enjoy reading my RSS feeds across my devices - whether itās on my phone when out and about, my Mac in between bouts of work, or my iPad when in downtime. Being able to sync feeds across these ... (2 minute read)
The problem Image processing and resizing is a common task in many types of applications. This is made even more important by modern phones that take photos several megabytes in size. For example, if ... (4 minute read)
Loading indicators In user-facing software, loading indicators are extremely important to let your users know that something is happening. This is the same no matter whether your software is a CLI pro... (6 minute read)
Google and DuckDuckGo Itās common knowledge that part of Googleās business model is to use the data it knows about you, your searches, and browsing patterns in order to more effectively se... (3 minute read)
Wales Tech Week is an annual event held by Technology Connected. The 2021 event is running this week, aiming to bring technologists together from a wide range of businesses and organisations across Wa... (1 minute read)
Living without workspaces IDEs and richly-featured text editors - such as VS Code and Sublime Text - support many great features. One of these is the notion of projects or workspaces. Such workspaces ... (5 minute read)
Recently Iāve noticed that some of the RSS feeds I subscribe to have become more and more restrictive. A post might contain just a title, or perhaps a short snippet or introductory paragraph, wi... (5 minute read)
Someone non-technical recently asked me the question, āwhat actually is a server?ā. They knew it was just a type of computer that runs somewhere that can be accessible over the internet, b... (5 minute read)
For a couple of years now I have been using a self-hosted Nextcloud as a replacement for iCloud and Google Drive. I wonāt go into the details as to why (especially given the additional upkeep an... (5 minute read)
In this post I will talk a little about how I handle my digital notes and to-do lists. In the spirit of my last post on data sovereignty, the focus will be on self-hosted approaches. To-do list manage... (5 minute read)
The term ādata sovereigntyā is something we hear much more about these days. Increasingly Iāve also heard it being mentioned in different contexts. Weāve seen it more in the wo... (2 minute read)
I listen to a number of podcasts each week. One of these is Go Time. The Go Time podcast releases episodes every Thursday. Its format is mostly comprised of panel discussions and interviews with found... (2 minute read)
As you may know, I recently purchased the beta edition of the Pinephone. It arrived last week in the Pinephone Beta Edition box shown below. As mentioned in my previous post on the subject, I bought t... (3 minute read)
As is the case with many countries, all businesses in the UK must report the state of their financial accounts to the relevant inland revenue service at their year-end (in the UK, this is HMRC). This ... (4 minute read)
I donāt use Facebook often. In fact, I only have an account currently because our company uses the āLogin with Facebookā functionality in order to offer an additional single sign-on ... (2 minute read)
Like many people, I own and manage multiple email accounts - for example, some are for work, for home, or for specific projects. I used to be a strong user of solely web-based email clients (such as G... (7 minute read)
Simple and RESTful HTTP APIs The HTTP standard is an expressive system for network-based computer-computer interaction. Itās a relatively old standard - it started life as HTTP/1.0 in 1996 and t... (6 minute read)
Pre-ordering the PinePhone Beta Earlier this week I ordered a PinePhone, which recently became available as a Beta Edition. Iāve been excitedly following the progress of the PinePhone for some t... (2 minute read)
Why use decentralised communication services Centralised communication services, such as Telegram, Signal, and Whatsapp, offer convenient means to chat to friends and family using your personal device... (7 minute read)
The last twenty years of internet evolution Although I was still somewhere between being of single-digit age and a young teen back in the ā90s and early ā00s, I still fondly remember disco... (5 minute read)
Minimising possessions Like many people I these days try and live a minimal life when it comes to possessions. Having more stuff means there is a greater level of responsibility required to look after... (6 minute read)
RSS has had a bit of a resurgence for personal websites and blogs in recent years, especially with the growing adoption of Small Web and IndieWeb ideologies. Many static site generators - including Hu... (7 minute read)
Pythonās Flask framework is an easy and excellent tool for writing web applications. Its in-built features and ecosystem of supporting packages let you create extensible web APIs, handle data an... (8 minute read)
By now Iām sure everyone has heard the horror stories about people (seemingly-) randomly losing access to their Google accounts. Often the account closures are reported to have been accompanied ... (8 minute read)
For many small or personal services running on a VPS in the cloud, administration is often done by connecting directly to the server via SSH. Such servers should be hardened with firewalls, employ an ... (4 minute read)
Many people no longer feel comfortable using Facebook. Whether you were never a member to begin with or youāve had an account but chosen to remove yourself from the service, or youāve simp... (5 minute read)
Shapes and patterns can be leveraged in user interfaces to guide your users, draw attention to content, lend weight or emphasis, or just for aesthetics and decoration. Layout and styling on the web is... (2 minute read)
React state React state management is what gives the library its reactiveness. Itās what makes it so easy to build performant data-driven applications that dynamically update based on the underl... (5 minute read)
Many people would consider RSS - Really Simple Syndication - to be a relic of the past. However I think it has been making a comeback. RSS is a mechanism by which people can automatically receive upda... (9 minute read)
If you need a database for your next project, why not first consider if SQLite might be a good option? And I donāt mean just for getting an MVP off the ground or for small personal systems; I me... (3 minute read)
If youāve visited my geminispace (gemini://wilw.capsule.town) youāll have noticed that Iāve recently been on a mission to decentralise the every-day tools and services I use, and wil... (4 minute read)
Gemini is a newer internet protocol designed to provide a more lightweight, privacy- and content-focused experience. For more information I recommend reading this blog post about it. I try not to repl...
Over the past few months I have been trying to use centralised ābig techā social media platforms less and instead immerse myself into the more community-driven āfediverseā of d... (3 minute read)
Building apps on serverless architecture has been a game-changer for me and for developers everywhere, enabling small dev teams to cheaply build and scale services from MVP through to enterprise deplo... (6 minute read)
If you write React web apps that interface with a backend web API then definitely consider trying React Query. The library makes use of modern React patterns, such as hooks, to keep code concise and r... (1 minute read)
This short post introduces a useful JavaScript operator to help make your one-liners even more concise. The specification was added formally in the 11th edition of ECMAScript. It is implemented as a l... (1 minute read)
JavaScript has lots of handy tools for creating concise code and one-liners. One such tool is the optional chaining operator. The optional chaining operator is useful for addressing an attribute of a ... (2 minute read)
I recently stumbled across an article on Hacker News discussing the pros of basic personal accounting using GnuCash - a free and open-source desktop accounting program. The article was interesting as ... (26 minute read)
This note documents the set-up of a k8s cluster from scratch, including ingress and load-balanced TLS support for web applications. Itās mainly for myself to revisit and reference later on. The ... (6 minute read)
ZEITās Now service is great for deploying apps and APIs that are able to make use of serverless execution models, and I use it for many of my projects (including this website, at the time of wri... (2 minute read)
A previous note about Philips Hue bulbs got me thinking that the API exposed by the bridge might be used to warn if the house lights are left on too late at night, or even if they get turned on at une... (1 minute read)
I recently blogged about Nintendo Hotspot data and mentioned it could be more usefully consumable in a native mobile app. As such, I wrote a small Android app for retrieving this data and displaying i... (1 minute read)
Since getting a DS, StreetPass has become quite addictive. Itās actually pretty fun checking the device after walking through town or using public transport to see a list of Miis representing th... (3 minute read)
A couple of years ago I wrote a blog post about wrapping some of Wekaās classification functionality to allow it to be used programmatically in Python programs. A small project Iām current... (1 minute read)
As is the case with many people, all music I listen to on my PC these days plays from the web through a browser. Iām a heavy user of Google Play Music and SoundCloud, and using Chrome to handle ... (2 minute read)
A while ago I wrote an article for Herokuās Dev Center on carrying out direct uploads to S3 using a Python app for signing the PUT request. Specifically, the article focussed on Flask but the co... (1 minute read)
In my last post I discussed methods for streaming music to different zones in the house. More specifically I wanted to be able to play music from one location and then listen to it in other rooms at t... (3 minute read)
For a while, now, I have been looking for a reliable way to manage zoned music-playing around the house. The general idea is that Iād like to be able to play music from a central point and have ... (3 minute read)
Last week I released a new version of the tides Android app Iām currently developing. The idea of the application was initially to simply display the tidal times and patterns for the Gower Penin... (2 minute read)
Back in March, I emailed Magic Seaweed to ask them if they had a public API for their surf forecast data. They responded that they didnāt at the time, but that it was certainly on their to-do li... (2 minute read)
I today issued a full upgrade of the server at flyingsparx.net, which is hosted by Digital Ocean. By default, on Arch, this will upgrade every currently-installed package (where there is a counterpart... (2 minute read)
Over the last few months, Iāve started to use Weka more and more. Weka is a toolkit, written in Java, that I use to create models with which to make classifications on data sets. It features a w... (2 minute read)
This is just a quick post to mention that I have made the source for the Gower Tides app on Google Play public. The source repository is available on GitHub. From the repository I have excluded: Image... (1 minute read)
My hosting for my website has nearly expired, so I have been looking for renewal options. These days I tend to need to use servers for more than simple web-hosting, and most do not provide the flexibi... (1 minute read)
Iāve been having trouble connecting to Eduroam, at least reliably and persistently, without heavy desktop environments or complicated network managers. Eduroam is the wireless networking service... (2 minute read)
I wanted a way in which users can seamlessly upload images for use in the Heroku application discussed in previous posts. Ideally, the image would be uploaded through AJAX as part of a data-entry form... (2 minute read)
A few posts back, I talked about the development of an Android app for tide predictions for South Wales. This app is now on Google Play. If you live in South Wales and are vaguely interested in tides/... (1 minute read)
Iāve taken to writing most of my recent presentations in plain HTML (rather than using third-party software or services). I used JavaScript to handle the appearance and ordering of slides. I bun... (1 minute read)
Iāve always been interested in the development of smartphone apps, but have never really had the opportunity to actually hava a go. Whilst Iām generally OK with development on platforms I ... (3 minute read)