diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8deb404a..e4f35365 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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 diff --git a/package.json b/package.json index bff435a3..b349abd0 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,9 @@ "name": "astro-cactus-blog", "version": "6.5.0", "type": "module", + "engines": { + "node": ">=24" + }, "scripts": { "dev": "astro dev", "start": "astro dev", diff --git a/src/content/note/fuse.md b/src/content/note/fuse.md new file mode 100644 index 00000000..1816495a --- /dev/null +++ b/src/content/note/fuse.md @@ -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. \ No newline at end of file diff --git a/src/content/post/fastmail/davx5-app-password.txt b/src/content/post/fastmail/davx5-app-password.txt new file mode 100644 index 00000000..f3b92b62 --- /dev/null +++ b/src/content/post/fastmail/davx5-app-password.txt @@ -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. \ No newline at end of file diff --git a/src/content/post/fastmail/davx5.mdx b/src/content/post/fastmail/davx5.mdx new file mode 100644 index 00000000..7a9b3be3 --- /dev/null +++ b/src/content/post/fastmail/davx5.mdx @@ -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 ** 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. +::: \ No newline at end of file diff --git a/src/content/post/fastmail/how_davx5_interacts_with_other_components.png b/src/content/post/fastmail/how_davx5_interacts_with_other_components.png new file mode 100644 index 00000000..c5a5525b Binary files /dev/null and b/src/content/post/fastmail/how_davx5_interacts_with_other_components.png differ