I turned "I should really get my LinkedIn history onto my blog" into an actual pipeline with Claude Code and Claude in Chrome doing most of the work.

**How it works:**

- Claude in Chrome scrapes my LinkedIn posts, clicks through all short links to resolve them, and exports them as JSON. I process them in batches of 5.
- To process more posts, I just tell Claude in Chrome: "Do another 5" - it keeps track of where it left off.
- Claude Code filters posts: only technical content is imported; non-technical posts and (nearly) duplicates trigger a warning.
- Claude Code generates the full post - title, summary, body, and tags - all wired into my auto-SEO pipeline. And as a bonus it renders code and CLI commands in code blocks.
- It downloads images from LinkedIn, uploads them to Cloudflare storage, and rewrites the image URLs in the articles.

The only manual step is copying the JSON from my downloads folder into the mounted folder of the Docker container.

**Efficiency win mid-pipeline:**

I started a fresh Claude in Chrome session to reduce context. The first batch in that new session still used almost 40% of my session limit. I asked: "Can you do this more efficiently in the next batch?"

Claude's answer: most of the cost was full-resolution screenshots and visual transcription. Claude suggested to:

- Pull post text directly from the DOM with JS queries instead of reading it off screenshots.
- Extract links, hashtags, and analytics URLs in one JS call instead of multiple "find" operations.
- Batch scroll/click/extract sequences into single browser batch calls to cut round trips.

Result: the next batch used only around 5% of my session limit instead of ~40% - and in half the time!

I exported and imported all my 86 blog posts this way.


**Afterward: the pipeline couldn't see video**

A while after the import, I remembered a chunk of my posts had a demo video attached, not just text and screenshots - and the manifest schema never had a field for that at all, so the pipeline was silently blind to it. Going back through my own LinkedIn history, I found 9 posts with a real video: one early one I decided to leave unpublished (my first video demo, a bit rough), and 8 already-published articles quietly missing their video.

Rather than scraping and re-hosting the raw video files, I used LinkedIn's own "Embed video only" option (under a post's "..." menu) - a clean iframe pointing back at the original post. The trade-off: if I ever delete that LinkedIn post, the embed goes with it. Unlike the article images, which I deliberately re-hosted on my own Cloudflare storage during the import specifically to avoid that kind of dependency, I accepted it here for the much lower effort of 8 embeds versus downloading and re-hosting 8 videos.

**Worth folding into the pipeline next time:** this was a retroactive fix, not something the import process does automatically. A future capture pass could check whether a post has a video attached and grab the embed code as part of the initial import, instead of a separate audit afterward.

Semi-automated by design, with clear security boundaries and a smart, optimized workflow that filters for relevance, avoids duplicates, resolves short links, generates complete blog posts, and tracks progress across batches.

![Claude Code reviewing a batch of captured LinkedIn posts alongside Claude in Chrome doing the browser automation](https://images.koorevaar.com/linkedin-import/efficiently-import-linkedin-posts-with-claude.png)

---

*Co-authored with Claude.*

If this was useful, [you can buy me a coffee](https://ko-fi.com/p47k0).

New articles: [follow via RSS](https://blog.koorevaar.com/feed.xml).
