The minimalist, ultra-lightweight, self-hosted privacy alternative to iCloud.
pineapple-cloud unifies your native macOS & iOS Apps (Contacts, Calendar, Reminders, and Notes) into a single, highly efficient Docker stack running completely on your local network.
Unlike heavy groupware solutions like Nextcloud, which demand over 1GB of RAM and put a heavy load on budget systems, pineapple-cloud runs under 100MB of idle RAM. It is optimized to keep mini-servers, Raspberry Pis, and budget NAS units (like the Synology J-series) running cool and responsive.
Apple's native device ecosystem splits accounts across two entirely distinct sync protocols:
- CalDAV & CardDAV: Controls native Calendar timelines, Reminders checklists, and Contact cards.
- IMAP (Mail Server Storage): Operates quietly behind the scenes to sync Apple Notes.
pineapple-cloud bridges this gap inside an isolated Docker network by pairing a local IMAP Mailserver Container with the streamlined Radicale DAV Engine. No bloated databases or heavy web UI dashboards—just clean, protocol-native syncing.
- 📝 Native Apple Notes Sync: Handled natively via local IMAP. No public mail routing or domain MX records required.
- 🗓️ Native Apple Calendar & Reminders: Managed directly by Radicale's lightning-fast CalDAV engine.
- 👤 Native Apple Contacts: Instant address book populating via CardDAV.
- 🪶 Low-Resource Engineering: Under 100MB RAM usage. Minimizes hard drive swap-writes, making it highly safe during sudden power interruptions.
- 📦 Fully Portable Volume Layout: Relative pathing structures (
./data) let you migrate your entire setup between hosts instantly.
Open your terminal and create the configuration tree:
mkdir -p pineapple-cloud/data/mail-data pineapple-cloud/data/mail-config pineapple-cloud/data/radicale-data pineapple-cloud/data/radicale-config pineapple-cloud/data/radicale-certs
cd pineapple-cloudCreate a file named docker-compose.yml and add the verified container service definition layer:
services:
# IMAP Server - Apple Notes
imap-server:
image: mailserver/docker-mailserver:latest
container_name: apple-imap
ports:
- "143:143"
environment:
OVERRIDE_HOSTNAME: pineapple.cloud
ENABLE_POP3: "0"
ENABLE_SMTP: "0"
ENABLE_SPAMASSASSIN: "0"
ENABLE_CLAMAV: "0"
ENABLE_FAIL2BAN: "0"
ONE_DIR: "1"
cap_add:
- NET_ADMIN
volumes:
- ./data/mail-data:/var/mail
- ./data/mail-config:/tmp/docker-mailserver
restart: unless-stopped
# DAV Server - Apple Contacts, Calendar and Reminders
radicale:
image: tomsquest/docker-radicale:latest
container_name: apple-dav
ports:
- "5232:5232"
volumes:
- ./data/radicale-data:/data
- ./data/radicale-config:/config:ro
- ./data/radicale-certs:/certs:ro
restart: unless-stoppedLaunch the core architecture in detached background mode:
docker compose up -dTo add your account, drop into the running container's bash shell and use the internal interactive account provisioning script:
Step A: Access the container shell:
docker exec -it apple-imap /bin/bashStep B: Inside the container prompt, execute the setup script with your chosen identity details and password:
setup email add your_name@pineapple.cloud
your_secure_passwordType exit to return to your host terminal when completed.
By default, Apple devices prefer encrypted connections. You have two options to manage your setup:
To prevent clear-text transfer warnings, generate local self-signed SSL certificates using OpenSSL:
openssl req -x509 -newkey rsa:4096 -keyout ./data/radicale-certs/server.key -out ./data/radicale-certs/server.cert -sha256 -days 3650 -nodes -subj "/CN=127.0.0.1"Once generated, double-click the server.cert file on your Mac to open Keychain Access, locate the certificate, and change its properties to "Always Trust".
If you run pineapple-cloud strictly on 127.0.0.1 (localhost) or an isolated home router subnet without setting up SSL, macOS will flag the plain-text traffic. When connecting, you must confirm the warning exceptions manually.
Open System Settings ➔ Internet Accounts on your Mac and bind each native service step-by-step using your screenshots as references:
- Navigate to Add Account... ➔ Add Other Account... ➔ CardDAV Account.
- Change the Account Type selector from Automatic to Manual.
- User Name: Your Radicale username.
- Server Address:
127.0.0.1(or your mini-server network IP). - Server Path:
/| Port:5232 - Note: Uncheck Use SSL if accessing via HTTP. Check it if you generated local keys.
- Navigate to Add Account... ➔ Add Other Account... ➔ CalDAV Account.
- Change the Account Type selector to Manual.
- Input your username and password database configurations as shown:
- Navigate to Add Account... ➔ Add Other Account... ➔ Mail Account.
- Use your configured full email domain address (e.g.,
your_name@pineapple.cloud). - When the "Unable to verify" prompt displays, pass the local loopback server IPs:
- Incoming Mail Server:
127.0.0.1 - Outgoing Mail Server (SMTP):
127.0.0.1
- Incoming Mail Server:
- Finalize the profile layer by unchecking Mail and exclusively checking Notes.
Because Apple strips rich canvas properties when a note is stored over open IMAP protocols rather than inside iCloud core servers, the following features will be modified:
- 🚫 Detailed font-size selectors and custom heading typography templates are disabled.
- 🚫 Native interactive checkbox bubbles, vector sketches, and inline database tables are restricted.
- 💡 Pro-Tip: Utilize traditional typography elements like Bold (
Cmd+B), Italics (Cmd+I), or standard hyphens/asterisks (*) to create clean, readable lists that render perfectly into plain text HTML folders.
Have improvements or configuration profiles to share?
- Fork the codebase.
- Cut an active development branch (
git checkout -b feature/AmazingFeature). - Commit your adjustments (
git commit -m 'feat: optimize connection handling'). - Push to your branch and open a Pull Request targeting our
developtracking branch.
If this project helped you reclaim ownership of your personal data, drop a ⭐ to help other Apple power-users discover us!
pineapple-cloud is open-source software distributed under the terms of the GNU GPLv3 (or later) license.



