Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
- name: install node
uses: actions/setup-node@v3
with:
node-version: 23
node-version: 24

- name: install pnpm
uses: pnpm/action-setup@v2
Expand Down
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
"name": "astro-cactus-blog",
"version": "6.5.0",
"type": "module",
"engines": {
"node": ">=24"
},
"scripts": {
"dev": "astro dev",
"start": "astro dev",
Expand Down
8 changes: 8 additions & 0 deletions src/content/note/fuse.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "FUSE on macOS"
publishDate: "2026-03-15T13:00:00-05:00"
---

If you're looking to use [FUSE](https://en.wikipedia.org/wiki/Filesystem_in_Userspace) on macOS, do not use [macFuse](https://macfuse.github.io/), use [FUSE-T](https://www.fuse-t.org/) instead.

> The main motivation for FUSE-T is to replace macFuse, which implements its own kernel extension to make FUSE work. With each version of macOS, it's getting harder and harder to load kernel extensions. Apple strongly discourages it and, for this reason, software distributions that include macFuse are very difficult to install.
20 changes: 20 additions & 0 deletions src/content/post/fastmail/davx5-app-password.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
### Option B: App password

I haven't tried this option yet, but I've used app passwords for other integrations with Fastmail and they have worked well.

If OAuth doesn't work for you, you can use an app password instead. Fastmail requires an app password for third-party apps like DAVx⁵, so your regular password won't work here.

1. In Fastmail, go to **Settings → Privacy & Security → App passwords**.
2. Click **New app password**, verify with your password, and give it a name (e.g. "DAVx⁵").
3. Under data access, select **Mail, calendars and contacts**.
4. Copy the generated password.
5. In DAVx⁵, tap the **+** button and choose **Login with email address**.
6. Enter your Fastmail email and the app password from step 4.

If you use a custom domain without SRV records, choose **Login with URL and user name** instead and enter:

- **Base URL:** `https://fastmail.com`
- **User name:** your email address
- **Password:** your app password

If autodiscovery still fails, Fastmail's [Server names and ports](https://www.fastmail.help/hc/en-us/articles/1500000278342-Server-names-and-ports) page has the full CalDAV/CardDAV settings and URL paths.
59 changes: 59 additions & 0 deletions src/content/post/fastmail/davx5.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
---
title: "How to Sync Fastmail Contacts and Calendars with Android"
publishDate: "2026-03-16"
description: "Step-by-step guide to syncing your Fastmail contacts and calendars on Android using DAVx⁵."
tags:
- tools
---

import { Icon } from "astro-icon/components";

I'll be completely honest - I found syncing my Fastmail contacts and calendars with my Android phone clunky and confusing. Android doesn't natively support the CalDAV and CardDAV protocols used to sync calendars and contacts. [DAVx⁵](https://www.davx5.com/) fills that gap - it's an open-source sync adapter that connects your Android device to any CalDAV/CardDAV server, including Fastmail. I'm writing the guide I would have wanted if I were setting up DAVx⁵ for the first time to sync with a Fastmail account.

DAVx⁵ is available on [Google Play](https://play.google.com/store/apps/details?id=at.bitfire.davdroid&hl=en_US) (currently $6.49) and on [F-Droid](https://f-droid.org/packages/at.bitfire.davdroid/) (donations encouraged). Below is a nice diagram illustrating how the DAVx⁵ app keeps your contacts and calendars in sync with the server (copied from the [introduction](https://manual.davx5.com/introduction.html) to the DAVx⁵ manual).

![](./how_davx5_interacts_with_other_components.png)

## Setup

DAVx⁵ supports two ways to connect with Fastmail: OAuth and app passwords. You'll need a Fastmail Standard plan or higher for this to work. Fastmail Basic plans don't include app passwords, CalDAV, or CardDAV access. Here's how to connect your account via OAuth:

1. Open DAVx⁵ and tap the **+ Add account** button.
2. Choose **Fastmail** in the **Provider-specific login** section.
3. Sign in using your fastmail.com email address.
4. Allow DAVx⁵ to (1) download, modify, and permanently delete your contacts and contact groups (2) download, modify, and permanently delete your calendars and events.
5. Select the account you want to use as the calendar event organizer. This is important if you use a custom domain (I selected andrew@andrewmarder.net, not my Fastmail email address).
6. Keep the default setting of **Contact group method = Groups are separate vCards**.
7. Tap the **Finish** button.
8. On both the CalDAV and CardDAV tabs, toggle them on so your calendar and contacts stay in sync.

The initial sync of contacts can be **extremely** frustrating. For each contact, DAVx⁵ downloads the contact's avatar from the email provider. I have a few hundred contacts and had to let DAVx⁵ run overnight to download them all. The UI gives very little indication of what's happening, and the log files weren't especially helpful. I didn't have any issues with the initial calendar sync - it downloads data from Fastmail only. My best advice: try to be patient (not always a strength on mine).

DAVx⁵ gets your data into Android storage; now you need to configure your apps to use the correct place in storage. I'm currently using [Fossify Calendar](https://play.google.com/store/apps/details?id=org.fossify.calendar) and Google Contacts but let me know if there are better apps out there (Fossify Contacts looks popular).

### Fossify Calendar

In Fossify Calendar's Settings, toggle CalDAV sync on. Select the calendars you want to sync. Your events should show up! Sometimes I click the three dots in the search bar and select **Refresh CalDAV calendars**, I'm not sure when that's necessary.

### Google Contacts

In Google Contacts, click the avatar in the search bar → **Contacts settings** → **Default account for new contacts**, select **Device and DAVx⁵ Address book**. You should be good to go!

## Manual Sync

Each account in DAVx⁵ has separate tabs for CardDAV (address books) and CalDAV (calendars), but you don't need to sync each tab individually. Tap the **<Icon name="mdi:sync" class="inline h-[1em] w-[1em]" /> Synchronize now** button at the bottom of the screen and DAVx⁵ syncs all tabs at once. There's also a **Sync all** button on the main accounts screen that syncs all accounts in one tap (if you have multiple accounts).

If something goes wrong, DAVx⁵ posts a notification with a summary of the error. Tap the notification to see details. For deeper investigation, go to **DAVx⁵ → Settings → Verbose logging** and toggle it on. DAVx⁵ writes a detailed log of every HTTP request and response to a file. A persistent notification appears with a **Share** action you can use to send the log to an email app or file manager. Turn verbose logging off when you're done - the log is deleted automatically.

## Things to Know

- **Allow unrestricted battery usage.** Android will throttle or stop DAVx⁵'s background sync to save battery unless you exempt it. Go to **Settings → Apps → DAVx⁵ → Battery** (or **App battery usage**) and select **Unrestricted**. Without this, syncs may only happen when you manually open the app.
- **Manufacturer-specific app killing.** Even after setting "Unrestricted" in stock Android, phones from Xiaomi, Huawei, OnePlus, Oppo, Samsung, and others layer on their own autostart prevention and background restrictions that can silently kill DAVx⁵. Check [dontkillmyapp.com](https://dontkillmyapp.com/) for device-specific instructions.
- **Existing device contacts don't sync up automatically.** If you already have contacts stored locally on your phone, DAVx⁵ won't copy them to Fastmail. You'll need to [import them into Fastmail](https://www.fastmail.help/hc/en-us/articles/1500000280081) separately.
- **Sync interval.** DAVx⁵ can sync on change and on a schedule, but exact timing depends on your sync interval settings and Android's battery/network restrictions. You can adjust the interval in DAVx⁵'s account settings or trigger a manual sync at any time. I believe the default sync interval is every 4 hours.
- **Read-only subscription calendars.** If you subscribe to external calendar feeds in Fastmail (e.g. a shared team calendar or a public holiday feed), those sync as read-only. If you add a reminder to an event in one of those calendars on your phone, DAVx⁵ will try to push the change, get an HTTP 403 Forbidden error from Fastmail, and keep retrying every sync cycle until you remove the reminder.
- **VPN battery drain.** If you use a persistent VPN (e.g., WireGuard) and lose your network connection, DAVx⁵ can enter a loop of failed connection attempts that drains your battery. The VPN reports a connected tunnel but there's no actual internet, so DAVx⁵ keeps retrying.

:::warning{title=Postscript}
IMO this shouldn't be this hard. Google has purposefully made this hard to lock users into their ecosystem. I applaud the crew behind DAVx⁵ for fighting the good fight and supporting open standards.
:::
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading