How to Move Your Data Off Google with Takeout (Photos, Drive, Keep, Contacts and Calendar onto Your Server)

By now the server can replace most of what a Google account does: Immich for Photos (46), Nextcloud for Drive (32), Joplin for Keep (132), Nextcloud or Radicale for Contacts and Calendar (150), FreshRSS for the news feed (89). The hard part isn't the apps, it's getting fifteen years of data out of Google in a usable shape — Takeout exports it, but Photos in particular comes out scrambled. This is the order to do it in and the fixes for each service.
Quick reference
| Google service | Export format | Goes into | Gotcha |
|---|---|---|---|
| Photos | folders of images + JSON sidecars | Immich | dates and locations are in the JSON, not the files |
| Drive | original files (Docs as .docx/.xlsx/.pptx) | Nextcloud | shared files you don't own aren't included |
| Keep | one JSON + HTML per note | Joplin | needs a converter |
| Contacts | vCard (.vcf) | Nextcloud Contacts / Radicale | export groups separately if needed |
| Calendar | .ics per calendar | Nextcloud Calendar / Radicale | recurring events fine; attachments lost |
| .mbox | Thunderbird / Nextcloud Mail / archive | keep the Google address alive for a year |
1. Request the export
takeout.google.com → Deselect all, then tick only the services you're migrating (Photos is huge — do it on its own). Multiple formats → Drive documents as Office formats, Keep as JSON+HTML, Contacts as vCard. Export once, .zip or .tgz, 50 GB chunks, delivered to Drive or as download links. Photos for a family takes a day or two to prepare; download the chunks straight to the server with wget from the links (use tmux, tutorial 19).
Unpack on the data drive:
mkdir -p /mnt/data/takeout && cd /mnt/data/takeout
for f in takeout-*.zip; do unzip -q "$f"; done
2. Photos → Immich
Takeout's Photos folder puts each image next to a .json with its real date, GPS and description — and strips some of that from the image itself. Fix the files first with google-photos-takeout-helper (writes the JSON metadata back into the EXIF, merges album folders, removes duplicates):
pipx install google-photos-takeout-helper
google-photos-takeout-helper "Takeout/Google Photos" /mnt/data/photos-fixed --albums "json"
Then into Immich via the CLI (so albums and dates survive):
npx @immich/cli login https://photos.example.com YOUR_API_KEY
npx @immich/cli upload --recursive --album-name-from-folder /mnt/data/photos-fixed
Thousands of photos take hours; let it run in tmux. Afterwards, the phone app's backup carries on from today.
3. Drive → Nextcloud
Takeout gives you the files as files, Google Docs converted to .docx etc. Copy the folder into your Nextcloud data directory and let Nextcloud index it:
rsync -a "Takeout/Drive/" /mnt/data/nextcloud/john/files/Drive/
docker compose exec -u www-data app php occ files:scan --path=/john/files/Drive
Collabora (121) opens the converted documents. Files that were shared with you by others aren't in Takeout — ask the owners, or download those by hand first.
4. Keep → Joplin
Takeout's Keep export is one JSON per note. Convert with keep-to-joplin (or Joplin's own Google Keep importer in recent versions: File → Import → Google Keep (zip)), which keeps titles, text, checklists, labels as tags, and attached images. Pinned and archived states come across too.
5. Contacts and Calendar
Contacts: Takeout/Contacts/All Contacts/All Contacts.vcf → Nextcloud Contacts → settings → Import, or Radicale's web UI → upload. Then set the phone's CardDAV account to the server and remove the Google account's contacts sync.
Calendar: each .ics in Takeout/Calendar/ → Nextcloud Calendar → settings → Import, one per calendar. Same for CalDAV on the phone. Shared calendars from others: subscribe to them again from the server-side calendar app, or ask for a fresh invitation.
6. Mail — keep it, just move the reading
Takeout's .mbox imports into Thunderbird (ImportExportTools NG) for an offline archive, and tutorial 138 explains why hosting live mail is a different decision. The practical move: keep the Gmail address for a year, set forwarding to your new address (whatever it is), and gradually update logins. Leaving Google doesn't require deleting the account on day one.
7. Then switch the phone
Remove Google Photos' backup, turn on Immich's; point Contacts/Calendar at the server; install the Nextcloud client for files; Joplin for notes. Takeout once more in six months to catch anything that trickled in, then delete from Google what you've verified is on the server — and in your backups (23, 54).
Troubleshooting
Photos all dated the day of import. The JSON fix wasn't applied; run the helper, then re-upload (Immich dedupes by hash).
Immich CLI "unauthorized". Create an API key under your user's account settings, not the admin page.
Nextcloud doesn't show the copied files. occ files:scan wasn't run, or ownership isn't www-data.
Keep checklists came in as plain text. Older converter; use Joplin's built-in importer.
Wrapping up
Takeout per service, Photos fixed with the helper then uploaded by CLI, Drive rsynced and scanned, Keep imported, vCards and ICS files into the server's calendar app, mail archived and forwarded. A weekend of transfers, and the phone's defaults point at your server instead of Mountain View.
