linkedin-archive
Archive Marcel's recent LinkedIn posts into the Obsidian vault as weekly markdown files matching the social-corpus format. Use when Marcel says "archive my LinkedIn", "pull my LinkedIn", "/linkedin-archive", "update the social corpus", or "what did I post on LinkedIn this week — and capture it". Runs as a Claude cowork skill on Marcel's own machine (logged-in browser session); does NOT run on the gateway VM. Companion to the Twitter side (`~/.openclaw/bin/social-archive-x.mjs`, auto-cron Sat 21:00 Madrid) which uses the X API and runs unattended. LinkedIn API doesn't allow own-timeline reads at consumer tier, so this is intentionally manual/assisted.
- License 许可
- MIT
- 最近更新
- 2026-11-06
- Stars
- ★ 0
- Forks
- 0
01 前言 Front Matter
- name
- linkedin-archive
- description
- Archive Marcel's recent LinkedIn posts into the Obsidian vault as weekly markdown files matching the social-corpus format. Use when Marcel says "archive my LinkedIn", "pull my LinkedIn", "/linkedin-archive", "update the social corpus", or "what did I post on LinkedIn this week — and capture it". Runs as a Claude cowork skill on Marcel's own machine (logged-in browser session); does NOT run on the gateway VM. Companion to the Twitter side (`~/.openclaw/bin/social-archive-x.mjs`, auto-cron Sat 21:00 Madrid) which uses the X API and runs unattended. LinkedIn API doesn't allow own-timeline reads at consumer tier, so this is intentionally manual/assisted.
03 SKILL.md 正文
linkedin-archive
Capture LinkedIn posts into the Obsidian vault for the social-media-calendar corpus. Weekly files at _WORK/Social/linkedin/YYYY-WXX.md mirror the Twitter side so Merrick can read both as one source when planning content.
This skill runs in Claude cowork on Marcel's laptop — i.e. a Claude instance with browser tools and direct access to the synced Obsidian vault on disk. It does NOT run on the gateway VM (Albert). The OpenClaw side reads the vault but does not write to it from this skill.
When to invoke
Trigger when Marcel says:
- "archive my LinkedIn" / "pull my LinkedIn"
- "/linkedin-archive"
- "update the social corpus" (LinkedIn half — pair with the Twitter cron status)
- "what did I post on LinkedIn this week" + any "and capture it" framing
- "catch up the LinkedIn archive" (backfill mode)
Do NOT trigger when:
- The request is about drafting new LinkedIn posts → that's a content task, not archiving.
- The request is about competitors' LinkedIn → use
linkedin-research(Apify-based) instead.
Vault layout (read first, don't re-derive)
<vault-root>/_WORK/Social/
├── linkedin/
│ └── YYYY-WXX.md # ISO-week, this skill writes here
└── twitter/
└── YYYY-WXX.md # ISO-week, written by the X API cron — read-only for this skill
Find <vault-root> once per session: it's the Obsidian vault folder that contains _WORK/. On Marcel's Mac it's typically ~/obsidian/mf/ (matches the gateway VM path). If unsure, ask once, then remember for the rest of the session.
File format (match exactly)
Each weekly file:
---
source: linkedin
profile: https://www.linkedin.com/in/marcelfahle/
week: YYYY-WXX
---
# LinkedIn — YYYY Week NN
## YYYY-MM-DD — Title (first clause, ≤70 chars)
Reactions: N · Comments: N · Reposts: N
[View post](https://www.linkedin.com/feed/update/urn:li:activity:NNNNNNNNNNNNNNNNNNN/)
<full post text, preserving paragraph breaks>
<!-- id:NNNNNNNNNNNNNNNNNNN -->
---
Rules:
id= the numeric portion ofurn:li:activity:NNNN…. Stable across renames.- ISO week of
YYYY-MM-DD(Mon–Sun, year-of-Thursday) decides which file an entry lands in. - Order entries newest-first inside each week file.
- Preserve emoji, line breaks, and link text exactly as posted. Don't summarize or paraphrase the body.
- For shared/reposted/comment-only items: still capture if Marcel authored the comment; mark
Type: Comment on @<author>'s postand quote the parent in a>blockquote, mirroring the Twitter side's reply context.
Workflow
Step 1 — Pick a mode
Mode A: Browser scrape (default if cowork has a working browser tool).
- Open
https://www.linkedin.com/in/marcelfahle/recent-activity/all/. - Scroll until the earliest visible post is older than the most recent
<!-- id:… -->marker already present across the linkedin/ weekly files (find that marker first to know where to stop). - For each visible activity card, extract:
activity_id(from thedata-urnattribute or the "Copy link to post" menu —urn:li:activity:NNN)posted_at(the relative date on the card — resolve to absolute YYYY-MM-DD using today as anchor)text(full body — expand "see more" before extracting)reactions,comments,reposts(footer counters; treat blank as 0)- Post URL:
https://www.linkedin.com/feed/update/urn:li:activity:NNN/
- Skip cards Marcel didn't author (likes/saves of others). Keep comments Marcel wrote on others' posts — they're part of his voice.
Mode B: Paste mode (use if browser scrape is blocked or rate-limited).
- Ask Marcel to scroll to his recent activity and paste a chunk (multiple posts) of the page text.
- Parse the paste for activity blocks. LinkedIn's copy-paste leaves the same fields recognizable: byline, relative date, body, reaction counts.
- For activity IDs, Marcel can right-click → "Copy link to post" per item; ask for a small batch of links once you've parsed the bodies so you can fill in the
idand URL fields.
Step 2 — Dedup against existing files
For every candidate post:
- Read the target week file (compute it from
posted_at). - If the file already contains
<!-- id:<this-id> -->, skip. - Otherwise, insert the new entry newest-first (above existing entries in that week's H2 stream, after the frontmatter + H1).
If the week file doesn't exist, create it with the frontmatter + H1 header shown above, then add the entry.
Step 3 — Write to disk
Write the markdown files directly to <vault-root>/_WORK/Social/linkedin/YYYY-WXX.md. Obsidian Sync will push to the gateway VM where Merrick can read it.
Step 4 — Report back
End with a short summary in this shape (≤6 lines), so Marcel can spot misses:
LinkedIn archive: <total new> posts added across <N> weeks
YYYY-WXX: +N (top: <title>, eng=R/C/R)
YYYY-WYY: +N
Vault: <vault-root>/_WORK/Social/linkedin/
Anti-patterns
- Never invent post text, dates, or engagement numbers. If a field is missing from the source page or paste, leave it blank rather than guess. Engagement counts are a known LinkedIn-UI hide pattern at low values —
0is fine, made-up2is not. - Never overwrite an existing entry. Idempotency depends on the
<!-- id:N -->markers. If you spot a wrong entry, fix it in place; do not delete + re-add. - Never publish, edit, or react to LinkedIn posts from this skill. Read-only.
- Don't write to
_WORK/Social/twitter/— that side is owned by the X API cron on the gateway. Crossing the lane will fight the dedup on that side. - Don't summarize the body. The corpus is for Merrick to read Marcel's actual voice; paraphrase ≠ voice sample.
- Don't fall through to
linkedin-research. That skill is for other people's LinkedIn (competitors, prospects), not Marcel's own archive.
Cadence
- Marcel triggers this manually, typically weekly (Saturday or Sunday), to keep parity with the Twitter cron.
- A future companion (
scripts/linkedin-archive.mjs) could be added if Marcel decides to let cowork drive Playwright on a schedule. Not built yet — LinkedIn's anti-automation makes the manual trigger less brittle.
Reference
- Sibling skill:
skills/x-read/(X API, read-only). - Sibling automation:
~/.openclaw/bin/social-archive-x.mjson the gateway (auto Sat 21:00 Madrid). - Project context:
_WORK/Social/is the social-media calendar corpus; both halves feed Merrick's content planning. Seeproject_social_corpus.mdin the gateway memory.
04 同仓库更多 Skills
zight
Analyze Zight screenshots and screen recordings from share.zight.com links. Use this skill automatically when a Zight link appears in a ticket, user message, or bug report. Handles both images (view directly) and videos (extract frames, transcribe audio, analyze visually). Produces a structured summary of what the user sees and says in the recording.
x-read
Read tweets, threads, user timelines, mentions, bookmarks, likes, and search results from X (Twitter) via the official X API v2. Use when the user asks "what's in this tweet", "summarize this thread", "show my mentions / bookmarks", "what did <user> tweet about", "what's trending on X about <topic>", or pastes an x.com / twitter.com URL and wants the contents. Owned reads (the user's own posts, mentions, bookmarks, likes, followers, lists) cost $0.001 per resource since 2026-04-20; arbitrary tweet reads are $0.005. The skill never invents tweet text — every output is the literal API response or `null` when the API has no data. Does NOT post, like, follow, or mutate state — read-only.
video-teardown
暂无简介
keyword-research
Run real keyword research with DataForSEO. Volumes, CPC, keyword difficulty, SERP intent, competitor gaps, and clustered topical maps grounded in the user's ICP — not vibes. Use when the user wants to "do keyword research," "find keywords for," "build a keyword list," "what should I rank for," "check search volume," "find keyword gaps vs competitors," "build a topical map," "plan a content cluster," "set up Google Ads keywords," "build an AdWords campaign," or "find long-tail keywords." Pulls the ICP from the user's Obsidian vault when present, talks to DataForSEO directly (REST or MCP), and produces a prioritized, intent-tagged keyword plan ready to feed into Ads, content, or SEO. Does NOT invent volumes or CPCs — every number is cited to a DataForSEO endpoint and timestamp.
brand-dossier
Research a prospect/company/creator (from names or URLs) and produce a Bold demo-prep brand dossier — a folder with a paste-ready markdown file (org context, persona, tone, topics, transcription dictionary, conversation starters) plus downloaded logos and extracted brand colors. Use when preparing a Bold demo tenant for a prospect, or when asked to "research X for a demo", "make a dossier", or "brand research".
alpha-humanizer
Transform AI-generated content into prose that reads as 100% human-written. Use when the user wants to "humanize" text, make AI content undetectable, rewrite content to sound human, bypass AI detectors, remove the "AI voice," write with authentic human voice, or produce content that passes as organic human writing. Also triggers on "rewrite this to sound human," "make this not sound like AI," "humanize this," "remove AI patterns," "write like a real person," or any request to eliminate synthetic writing patterns. Handles blog posts, LinkedIn posts, sales copy, emails, essays, technical docs, social media, landing pages, product descriptions, and thought leadership. Does NOT just swap words — it restructures the cognitive architecture of the text.