Combining Ghost and Quarto (The Lazy Way)

How I combined my Ghost Blog and my Quarto Blog into one unified blog that gets the best of both platforms.

Combining Ghost and Quarto (The Lazy Way)
Photo by Google DeepMind / Unsplash

I currently manage two very distinct blogs: notes.ansonbiggs.com and projects.ansonbiggs.com. I don't like having more than one place where I write, but they both fill important roles. Notes is hosted using Ghost, which has a powerful editor, newsletter management, comments, and lets me write from any device. I've done a surprising amount of rambling on this blog from an airplane on my iPhone. My projects blog is built using Quarto, where blog posts are essentially Jupyter notebooks. The site is static and published using GitLab CI/CD. Quarto gives me a lot of freedom when I want a blog post that has code or interactive graphics, but I need a text editor with a super heavy dev container to do any writing. 

Consolidating my writing on the web to one place is very desirable to me, but I don't think I'm fully there yet. Fully integrating the blogs is too much work at the moment, so for now I'm doing it the "Lazy Way". Maybe once Ghost federates with ActivityPub, I'll fully commit. The reason I'm doing a lazy implementation for now instead of just doing all the work to fully integrate is that: 1. I don't want to do all of the work right now, I want to put my energy into producing more content. 2. I think my projects website can benefit greatly from all the cool features Ghost provides.

My lazy solution is to use an iframe to embed the post alongside a summary from the Kagi summarizer API. I know in my About page I say that I don't like using ChatGPT, but this is different than using an LLM to summarize posts. It’s a purpose-built model that far outperforms LLMs in 2024 in summary quality, token size, speed, and price. Using the Kagi summarizer is absolutely a shortcut, but I really hate writing SEO-type stuff, so I'm fine with the compromise for now. The summaries it makes aren't consistent across all of my posts, and obviously I could do a much better job writing about my work. However, I have a lot of old posts that I don't want to spend time on, and I like giving Kagi money.

Creating the post is handled by some Rust code in my pipeline that does the following:

%%{ init: { 'theme': 'dark', 'look': 'handDrawn', 'layout': 'elk' } }%% graph TD A[Write Quarto blog post in VSCode] -->|Commit & Push| D[Static Site Generation] subgraph "GitLab Pipeline" D --> E[Deploy to GitLab Pages] D --> |For main branch| G[Rust Code] G --> |Get post summary| H[Kagi Summarizer] H --> | Embed summary in Post| G end G --> |Upload to Ghost| I[Publish Summary on Ghost]
How a Projects post gets built for Ghost
⚠️
After I started doing this Google completely removed ansonbiggs.com and any subdomains from its index. The removal could be due to various other changes I've made to my sites but it's worth a callout that this probably isn't best for SEO. However, the end of the day we're making websites for humans, not spiders.

You can find examples of the output on any of my posts tagged with Projects Website. I'll also link an example below.

Notes on Nano
Nano (Ӿ) is a fast, feeless and severely underrated currency.

The Ghost API has is really nice to work with, I think the previous focus on supporting Jamstack really benefitted what I did here. The API makes it really easy to add canonical tags, meta descriptions, footer scripts, or anything else that you can do natively in the editor. Having this as an automatic part of my CI pipeline when it merges into the default branch is has worked super well. There is definitely a lot of room to grow this integration and I think if I continue using both blog platforms I'll put in the work to fully marry them eventually.

Overall, I'm happy with having my Ghost blog be a singular source of my writing. There is a lot of ground to cover to fully integrate the two sites, but for now its far from necessary. As I said in the start, my main focus is to spend time writing and creating posts. If you are anything like me it is significantly easier to spend a night tinkering the code for my platforms than it is to actually sit down a write out a post.