Greetings!
I am reasonably technical, but am new to the Ghost ecosystem.
I am currently an (unhappy) substack user. I found the mg-substack package, and thought: This might be my ticket off substack! (because I need to export a lot of images and mp4 content, which this tool appears to do)
Youāll need to install node.js which includes npm, then follow the readme instructions further down. You can install the LTS version of node if it asks you to pick a version
If you want to go the technical route of using a CLI tool, you obviously can cos we made that - but we have focused all of our efforts on making things easy to use on the UI:
If you login to a running Ghost instance, and navigate to settings > import/export (Or search for something like migrate) youāll get a nice UI that will help you through the process :)
I get an error running āmigrate substackā⦠How to recover? [OPEN ISSUE]
###@###:/usr/share$ sudo migrate substack --pathToZip /usr/2025dump.zip --url https://###.substack.com -V --scrape all --sizelimit 500
[sudo] password for ###:
info Migrating from export at /usr/2025dump.zip
[STARTED] Initializing
[OUTPUT] Workspace initialized at /tmp/mg/f26e7d3c65f16f91a87837ed58562005-substack-2025dump
[COMPLETED] Initializing
[STARTED] Read csv file
[2025-04-02 14:09:26] ERROR
[FAILED] Unable to read zip file /usr/2025dump.zip: Error: ADM-ZIP: Invalid filename
[2025-04-02 14:09:26] INFO
info Cached files can be found at /tmp/mg/f26e7d3c65f16f91a87837ed58562005-substack-2025dump
Error: ENOENT: no such file or directory, open ā/usr/share/localhost_development.logā
at readFileSync (node:fs:449:20)
at showLogs (file:///usr/lib/node_modules/@tryghost/migrate/lib/utilties/cli-log-display.js:8:21)
at TypeCommand.run [as _runHandler] (file:///usr/lib/node_modules/@tryghost/migrate/commands/substack.js:260:5)
at async Promise.all (index 23)
###@###:/usr/share$
I am going to break the command line issue into its own topic (will repost, I guess), as there are a range of related topics to dig into and this thread is all over the place maybe?
If my new thread is a sin of some kind, you can delete it?
My test/development environments are not internet visible [this is not going to change]. When I try to do the substack import within ghost, it fails saying my instance must be internet visible. (this will never be possible for me during dev/test/evaluation)
I will be doing this migration many times as part of the dev/eval process. The substack is updated 1-2 times a week. I need the command line.
I also need control over parameters. For example, there are large mp4 files on substack (50GB, 100GB, poss larger, havenāt inventoried yet)
Sounds like weād better figure out how to get this working, then! The error appears to be coming from adm-zip, which parses zip files. Good places to start (with apologies if youāve already tried some/all of these):
Does the file exist at /usr/2025dump.zip ?
Is the file definitely a zip, and not a .gz or .tgz?
If you unzip it and take a look inside, any surprises?
The later ENOENT error is that the tool is expecting /usr/share/localhost_development.log to exist. Iām thinking thatās a distractor, but a quick touch /usr/share/localhost_development.log before running is likely to resolve that error, making it a little clearer that it isnāt the problem ā and you might get something useful in that log.
I am reviewing the relevant Ghost docs, and realize I āread inā things that⦠arenāt thereā¦
Background: I have a lot of media assets (images and mp4 files) hosted within substack. These assets are not included in a substack export created within the substack console. (This is one of the reasons I dislike substack⦠it doesnāt give me a dump of all my data.)
Goal: A major goal in migrating to ghost is to migrate my entire content base out of the substack-verse into a -verse that I own/manage/back-up.
Question: Where in the migration-to-ghost are these assets migrated?
I mistakenly thought that āmigrate substackā utility did this. In other words, I thought āmigrate substackā was going to walk my substack and create a magical zip of everything (including assets) that would be in a format ready to import to ghost.
I now see (after 1-2 hours of misdirected hacking) that this is not the case. I now understand that āmigrate substackā does not touch assets. I now understand that āmigrate substackā simply massages the existing āsubstack exportā for migration to ghost.
This makes me sad. (I thought ghost was my arrival!)
Is there a way to achieve what I seek?
E.g. If 2 years of assets will remain in the substack-verse⦠the calculus [to justify migration] is not what I would like it to beā¦