GoToSocial Adventures: migrate from Pixelfed
762 words, 4 minutes
When I decided to stop publishing on Instagram, I seeked for alternatives and Pixelfed looked like a nice one. The fact that it had a migration feature from IG made me go for it.
But for reasons, I don’t want to use this software anymore. And now that GoToSocial features the Gallery / Gram-style layout , it is time to migrate the account and its data to GtS.
Create the GoToSocial account
In case it is not already done, create the GoToSocial account that will host the old Pixelfed data.
# doas -u _gotosocial ~_gotosocial/current/gotosocial \
--config-path ~_gotosocial/config.yaml \
admin account create \
--username bob --email bob@gts.example.com \
--password '<change me>'
Export the Pixelfed data
Pixelfed exports are JSON files. There is no content archive like in Mastodon and the “Statuses” export contains only textual elements of posts. All the media files are stucked on the Pixelfed server (as-of-now).
From the Pixelfed GUI, browse to /settings/data-export
and click the
“Download” buttons for the “Following”, “Followers”, “Statuses”,
Mute/Block List" and “Account” lists. Save those files in a directory;
named “archive”, for example.
Import the data using slurp
Get the slurp sources using git
and compile in using go
; as
described in the slurp
documentation
.
$ git clone https://github.com/VyrCossont/slurp
$ cd slurp
$ go mod download
$ go build .
slurp seem to require access to a local Web browser to authenticate the Pixelfed and GoToSocial accounts. So the software should probably be installed on the workstation rather than on the Fediverse server.
Authenticate slurp
on the GoToSocial account and proceed to the data
import. The source Pixelfed account needs to be accessible during import
so that the photos are grabbed from the Pixelfed server and uploaded to
GoToSocial. The Pixelfed JSON export files were saved in the “archive”
folder during the previous step.
# ./slurp --user bob@gts.example.com auth login
# ./slurp --user bob@gts.example.com archive import \
--format pixelfed \
--file archive/pixelfed-statuses.json \
--attachment-map-file archive/attachment-map.json \
--status-map-file archive/status-map.json \
--attachment-directory archive/media_attachments \
--allow-missing-custom-emojis
During the migration process, network outage happened on my side. This led to a bunch of errors such as:
2025/07/12 15:55:26 ERROR Couldn't upload media attachment (...) err=(...): net/http: TLS handshake timeout"
2025/07/12 15:55:26 ERROR Error retrieving or uploading attachment (...) err=(...): net/http: TLS handshake timeout"
2025/07/12 15:55:26 io: read/write on closed pipe
Hopefully, slurp
keeps track of what it does and how it fails /
succeeds. So running the “archive import” command a second time imported
all the posts that have previously failed.
A couple of other errors still kept happening:
2025/07/12 17:39:49 INFO Skipping status because it's a reply to another account' status=(...)
2025/07/12 17:39:49 INFO Skipping status due to visibility status=(...) visibility=direct
Those looked legit and I actually didn’t notice any of my public posts being targeted by those errors.
Once the migration is finished, I switched to the gallery layout, which
is not the default in GoToSocial. From the GtS Web GUI, browse to the
user’s preference section (/settings/user/profile
) and set the “Layout
for the web view of your profile” to “Gram-style gallery layout” to have
the photo-centric rendering.
Migrate the Pixelfed account
Read the GoToSocial migration documentation .
On the GoToSocial server, enable the alias for the old Pixelfed account.
From GoToSocial Web GUI, browse to /settings/user/migration
and
fill-in the alias field with the Pixelfed account that is being migrated.
Then click the “Save account aliases” button.
On the Pixelfed server, enable the migration to GoToSocial. From the
Pixelfed Web GUI, browse to /settings/account/migration/manage
.
Fill-in the “New Account Handle” and the “(Pixelfed) Account Password”
fields. Click the “Move followers” button.
On my private instance, the migration process failed!
I also tried with an alternate account on some other public instance. It
also failed.
The cryptic error message was something about a bad response from
GoToSocial. Looking at the logs, I could get the HTTP request that was
done. And passing it through cURL, I could see it was responding ok and
in the same way a Mastodon server does. So that’s probably a problem in
the Pixelfed code.
Thoughts on the process
The overall process of migrating the photos from Pixelfed to GoToSocial
worked like a charm thanks to slurp
. And that was my main scary
concern.
I was never really satisfied with running Pixelfed and never really used it intensively. So I just PM the 10 people that were following my Pixelfed account to notify the migration. Most of them manually switched to the new account.
All in all, most went ok. And slurp is definitively a great tool to have while account hoping.