본문으로 건너뛰기
cccskills
무료GitHub에 공개한국어 소개

Broadcast

준비된 글과 이미지, 영상을 X, LinkedIn, Bluesky, Instagram에 한 번에 게시합니다. 플랫폼별 제한 확인과 미리보기, 게시 결과 보고를 지원하며 X Articles, Omny 팟캐스트와 뉴스레터 공유도 가능합니다.

원문원문 설명 보기

Multi-platform social syndication CLI: post text and media to X, LinkedIn, Bluesky, and Instagram from one command, with per-platform limits, --dry-run, status checks; also X Articles, podcast episodes to Omny, newsletter shares. USE WHEN broadcast, post to social media, cross-post, post to all, syndicate, publish to all platforms, post to Instagram, check platform status, post this everywhere, share the newsletter, edition share card, newsletter share card, sponsor thank-you in the share. NOT FOR writing the copy itself, X-only ops (X), Substack.

danielmiessler/LifeOS스타 19,635(GitHub 19,635 + cccskills 0)

실행 점수 미검증

설치 방법 보기

이럴 때 유용합니다

  • 같은 공지를 여러 플랫폼에 함께 게시
  • 게시 전에 내용을 미리 확인
  • X에 긴 형식의 글 공개
  • 여러 플랫폼에서 뉴스레터 공유

한국어 소개

할 수 있는 일

준비된 글과 이미지, 영상을 X, LinkedIn, Bluesky, Instagram에 게시합니다. 각 서비스의 글자 수와 미디어 제한을 확인하고, 전송 전에 --dry-run으로 미리보기를 표시할 수 있습니다. 게시가 끝나면 플랫폼별 결과를 보고합니다. X Articles, Omny Studio 팟캐스트 에피소드 공개, 뉴스레터 공유 게시물도 지원합니다. 이 스킬은 준비된 콘텐츠를 배포하며 글 자체를 작성하지는 않습니다.

이럴 때 유용합니다

같은 공지를 여러 SNS에 게시하거나, 전송 전에 게시물을 확인하거나, 뉴스레터와 팟캐스트를 공유할 때 사용할 수 있습니다. Instagram은 미디어가 필수이므로 이미지나 영상을 함께 제공해야 합니다.

사용 예시

  • “이 글과 이미지를 X, LinkedIn, Bluesky에 게시해 주세요.”
  • “최근 X 게시물을 LinkedIn과 Instagram에도 공유해 주세요.”
  • “이 뉴스레터를 여러 SNS에 공유해 주세요.”

주의 사항

사용할 각 플랫폼의 인증 설정이 필요합니다. 이미지와 영상은 로컬 파일로 지정해야 합니다. Instagram은 글만 게시할 수 없습니다. 공개 전에 미리보기를 확인해야 하며, X Articles나 팟캐스트 에피소드처럼 되돌릴 수 없는 공개 작업은 확인을 기다립니다.

이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.

문서 점검

AI가 SKILL.md의 내용에서 주의가 필요한 작업과 도입 전제를 확인했습니다. 점수는 실제로 실행한 결과(실행 검증)만으로 매깁니다.

안전성전송·삭제·명령 실행 등을 명시하고 있는가
B일부 부족공개 게시를 수행하며 되돌릴 수 없는 공개는 확인을 기다린다고 합니다.
도입의 용이성필요한 도구나 API 키가 적고 적혀 있는가
B일부 부족플랫폼별 OAuth, 비밀번호 또는 API 키가 필요하며 Setup.md를 제공합니다.

점수에는 넣지 않았습니다. 2026년 10월 28일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.

평가가 다르다고 생각되면 재검토를 요청하기

어느 항목이 왜 다르다고 생각하는지 적어 주세요. 로그인은 필요 없습니다. SKILL.md와 대조해 평가를 다시 만들고 이곳에 반영합니다.

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

포함된 파일(36)

  • SKILL.md12.0 KB
  • Intents/Article.md5.4 KB
  • Intents/Auth.md6.7 KB
  • Intents/Bluesky.md1.6 KB
  • Intents/Instagram.md3.5 KB
  • Intents/LinkedIn.md4.4 KB
  • Intents/Podcast.md3.4 KB
  • Intents/Post.md5.6 KB
  • Intents/SecurityValidation.md3.4 KB
  • Intents/ShareNewsletter.md11.2 KB
  • Intents/Status.md1.9 KB
  • Intents/X.md3.4 KB
  • package.json615 B
  • Setup.md13.4 KB
  • src/adapters/base.ts1.4 KB
  • src/adapters/bluesky.ts4.4 KB
  • src/adapters/index.ts261 B
  • src/adapters/instagram.ts9.8 KB
  • src/adapters/linkedin.ts21.1 KB
  • src/adapters/twitter.ts4.3 KB
  • src/commands/article.ts5.8 KB
  • src/commands/post.ts14.3 KB
  • src/config.ts4.8 KB
  • src/format/linkedin-formatter.ts13.4 KB
  • src/index.ts16.2 KB
  • src/skill-config.ts2.5 KB
  • src/types.ts3.6 KB
  • src/utils/media.ts8.7 KB
  • src/utils/r2-stage.ts4.8 KB
  • Tools/Broadcast.ts376 B
  • Tools/InstagramAuth.ts9.0 KB
  • Tools/LinkedInAuth.help.md1.9 KB
  • Tools/LinkedInAuth.ts10.5 KB
  • Tools/LinkedInComment.ts3.5 KB
  • Tools/OmnyPublish.ts13.8 KB
  • tsconfig.json607 B

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Broadcast Skill

Contents: Ideal State · Intent Routing · Platforms · Data & Config · Gotchas · Examples

Posts to X/Twitter, LinkedIn, Bluesky and Instagram from one command, and also publishes X Articles, podcast episodes to Omny Studio and newsletter share posts. It checks each platform's character and media limits before sending, previews with --dry-run, and reports per-platform status. Auth is per platform (table under Platforms; first-time setup in Setup.md, day-two auth in Intents/Auth.md). X posting runs through the public X skill's tools and its OAuth 2.0 token store. This skill posts; it does not write the copy, which comes from a copywriting skill or the principal first.

Ideal State

  • A broadcast reaches every platform the principal named, and "all channels", "everywhere", "all three" or "all four" means all four; a platform that fails or is skipped is reported with its reason while the rest still post.
  • Each platform gets text that fits its own limit and format before anything is sent: X text is weighed and never sliced, and styled LinkedIn text goes in a run of its own.
  • When the principal hands over written prose, their words go out verbatim with only platform markup added; drafting new copy belongs to a copywriting skill.
  • A cross-post of the principal's latest X post ("put my latest tweet on LinkedIn and Insta") carries that post's exact text and media, read back from X with X/Tools/read.ts, with t.co links expanded to their real URLs and nothing added beyond LinkedIn styling.
  • Nothing public goes out unpreviewed: a --dry-run comes first, irreversible publishes (an X Article, a live podcast episode) wait for confirmation, and success is reported from what the platform returned (post links, X expanded_url matching the canonical URL, a verified Omny publish).

Intent Routing

IntentTriggerFile
X"post to X", "tweet", "post to Twitter"Intents/X.md
Article"post an article to X", "publish as an X article", "long-form on X", "intro post plus article link"Intents/Article.md
LinkedIn"post to LinkedIn", "LinkedIn post"Intents/LinkedIn.md
Bluesky"post to Bluesky", "Bluesky post"Intents/Bluesky.md
Instagram"post to Instagram", "Instagram post", "reel", "carousel"Intents/Instagram.md
Podcast"post as podcast", "publish podcast episode", "put this on the podcast", "Omny"Intents/Podcast.md
ShareNewsletter"share the newsletter", "newsletter share post", "post the newsletter to LinkedIn", "share this week's edition", "edition share card", "sponsor thank-you in the share"Intents/ShareNewsletter.md
Post"broadcast", "post to all", "cross-post"Intents/Post.md
Status"check status", "platform status"Intents/Status.md
Auth"configure", "auth", "setup platform"Intents/Auth.md
SecurityValidation"validate content", "check post"Intents/SecurityValidation.md
FileRead when
Setup.mdfirst-time setup: the Config.md fields, each platform's account and secrets, the scheduled token renewal, and the proof it works
Tools/running a platform tool directly; Tools/LinkedInAuth.help.md is the full LinkedInAuth.ts contract (the tool itself prints a one-line usage)

Platforms

PlatformAuthImagesVideosMedia limitsText limit
Twitter/XOAuth 2.0 user context (the X skill's token store); OAuth 1.0a keys for text onlyUp to 41 per postImages: 5MB, Videos: 512MB280 weighted characters (URLs = 23)
LinkedInOAuth 2.0 access tokenUp to 20 (multiImage)1 per postImages: 8MB, Videos: 500MB3,000
BlueskyApp passwordUp to 41 per postImages: 1MB, Videos: 50MB300
InstagramInstagram Login (60-day token)Up to 10 (carousel)1 (Reel)Images: 8MB JPEG, Videos: 300MB2,200
Podcast (Omny Studio)OMNYSTUDIO_API_KEY
X Articles (long-form)Same X OAuth 2.0 store

Supported formats:

  • Images: JPG, JPEG, PNG, GIF, WebP (Instagram auto-converts to JPEG)
  • Videos: MP4, MOV, AVI, WebM

--media takes local file paths only; a remote URL fails with "Media file not found". Instagram is media-required (no text-only posts) and JPEG-only for images; its R2 staging contract is in Intents/Instagram.md.

Post logs append to LIFEOS/MEMORY/STATE/Broadcast-YYYY-MM-DD.jsonl under your LifeOS directory (~/.claude/LIFEOS by default; LIFEOS_BROADCAST_LOG_DIR overrides it), outside the skill dir. The CLI entry points are bun ${LIFEOS_SKILL_DIR}/src/index.ts and its alias Tools/Broadcast.ts; each intent carries its own commands.

Data & Config

The skill body carries no handles, program IDs or newsletter identity. Account-bound values live outside the skill tree (release-excluded) in LIFEOS/USER/CUSTOMIZATIONS/SKILLS/Broadcast/Config.md: the Omny program, playlist ids and episode settings, which Tools/OmnyPublish.ts reads at runtime through src/skill-config.ts; the newsletter name, URL, edition label, the optional share features (sponsor thank-yous, the edition share card and its brand file, the card file prefix, the writing audit) and an optional house-rules overlay, which the ShareNewsletter intent reads; the optional posting preferences house_style and video_followup (both off by default), which post, edit and the platform intents read; and the account handles for reference. Every key, with a made-up example, is in Setup.md. X's token store is configured in the X skill's own Config.md (skills/X/Setup.md). Per-platform API keys are env-var names whose values live in ~/.claude/.env; LinkedIn, Bluesky and Instagram sessions live in ~/.broadcast/credentials.json.

Gotchas

  • "All channels" includes Instagram, which needs media. A post with no media still goes to the three text platforms and reports Instagram as skipped, so ship an image whenever one exists.
  • LinkedIn styling is converted from markdown, and required only under the house style. **bold**, # Header and the rest become LinkedIn's styled text (the table in Intents/LinkedIn.md). With house_style = true in Config.md, every LinkedIn post (cross-posts, newsletter shares, edits) carries a **bold** hook line or # Header lines, the author's words stay verbatim with only the markup added, and post and edit refuse LinkedIn content with no bold span or header line (exit 1, dry-run included); --linkedin-plain is the named exception. With the key absent or false (the default), plain text posts as written. Either way, because ** would show raw on X and Bluesky, LinkedIn gets its own run with its own styled file whenever styled text is shared with another platform.
  • X text is weighted, never raw-truncated. Every HTTP(S) URL counts as 23 characters, while Unicode uses X's code-point/emoji weighting. X/Tools/TwitterText.ts is the shared validator used by Broadcast and X/Tools/post.ts. Preserve the caller's exact text and full canonical URLs; if weighted length exceeds 280, fail closed instead of slicing or adding an ellipsis. After publishing, read the returned tweet with X/Tools/read.ts and confirm each expanded_url equals the intended canonical URL before reporting success.
  • Every video passes the PII gate before upload (LIFEOS/TOOLS/VideoPiiGate.ts, run by post and article): findings stop the post until you add --pii-reviewed; --skip-pii bypasses the scan loudly and is for when the scanner is down only.
  • The send gate proofs the exact bytes each platform receives. post runs SendGate's code-tier proof (LIFEOS/TOOLS/lib/SendGate.ts) on each platform's wire text and media immediately before the network call; a fail closes that platform and nothing is transmitted. Two LinkedIn exceptions: a LinkedIn video is held to LinkedIn's own spec and the video PII gate, not to the proof's file checks, and it uploads from its original path; and a link card's title, description and image are fetched from the linked page at send time, so the gate never sees them (on a URL-only post the commentary is that fetched title, and the gate proofs the URL).
  • LinkedIn's commentary field is "little text format" — unescaped ( ) [ ] { } < > @ # * _ ~ | silently swallow content. The API returns 201 and the post publishes truncated at the first reserved char, so a hook like "(No. 42) is out" is cut mid-line. escapeLittleText() in src/format/linkedin-formatter.ts escapes these outside URLs, well-formed mentions, and letter-led #Word hashtags (#42 still escapes), and assertLittleText() runs on the exact wire string before POST and throws on any unescaped reserved char, so this class now fails loud instead of shipping truncated. Truncation never cuts inside a mention. Dry-run shows the styled text without the escaping backslashes, cut where the escaped wire form is cut, with the link-card URL on its own line.
  • Auth tokens expire. If posting fails, re-check OAuth tokens for each platform before debugging the content.
  • ALL X posting — text and media — runs on the X skill's OAuth 2.0 token store. The twitter adapter hands every post to X/Tools/post.ts, which uses OAuth 2.0 user context (tweet.write + media.write + offline.access). Where the grant lives and who refreshes it is the X skill's Config.md, never this skill's. With no store configured, post.ts falls back to the OAuth 1.0a env keys for text only; X can revoke those keys without notice and they have no media path, so a split path would post text while video silently fails. A twitter 401 on text means the grant lost tweet.write; a 403 on media means the grant is missing media.write — either way, re-auth once via X/Tools/bookmarks.ts authorize.
  • status's twitter row verifies the path posting will use. It checks the X skill's token store first (hasOAuth2Store()) and calls /users/me through it; only with no store does it verify the OAuth 1.0a keys. Keys that merely sit in .env never count as connected, because revoked keys look exactly like live ones until a call fails.

Examples

User: "put my latest tweet on linkedin and insta"
→ Post intent
→ The X post's exact text, links expanded, is live on LinkedIn (bold hook added) and on Instagram with its image, both links reported
User: "Post to LinkedIn only: 'Finally moved the whole build to the new toolchain.' with link https://example.com/blog/toolchain"
→ LinkedIn intent
→ The post is live with the words verbatim and the article's link-preview card, and the post link is reported
User: "post my video ./my-export.mp4 to Instagram"  (the user's own local file; given only a link, the run asks for the local file and never downloads it)
→ Instagram intent
→ The file passes the PII gate and is live as a Reel; the Reel link is reported

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

AnnualReports

무료요약 있음

여러 업체와 공공기관의 사이버 보안 보고서를 검색하고 가져와 위협, 랜섬웨어, 침해 통계 등의 추세를 비교합니다. 분석에는 출처별 업체, 연도, 보고서를 표시하고 자료 간 차이도 따로 다룹니다.

  • 분류별 위협 보고서를 찾을 때
  • 특정 업체의 보고서를 가져올 때
  • 여러 업체의 랜섬웨어 동향을 비교할 때
danielmiessler/LifeOS2만2026년 10월 28일 업데이트

ApertureOscillation

무료요약 있음

기능이나 구성 요소 자체의 설계 요구와 시스템 전체의 목표를 세 단계로 비교합니다. 설계상의 충돌과 적절한 구현 범위를 정리하고, 제안한 설계가 전체 방향과 맞는지 평가합니다.

  • 서비스나 라이브러리를 분리할지 판단하기
  • 기능 요구와 제품 방향 비교하기
  • 새 구성 요소와 기존 시스템의 정합성 확인하기
danielmiessler/LifeOS2만2026년 10월 28일 업데이트

Aphorisms

무료요약 있음

글의 주제에 맞는 격언과 인용문을 찾아 저자와 선정 이유를 함께 제안합니다. 출처가 있는 인용문을 추가하고, 사상가의 말을 주제별로 조사하며, 사용 기록을 관리해 같은 인용문을 반복하지 않도록 돕습니다.

  • 뉴스레터에 어울리는 인용문 찾기
  • 출처와 함께 중복 없이 인용문 저장하기
  • 주제별로 사상가의 말 조사하기
danielmiessler/LifeOS2만2026년 10월 28일 업데이트

Art

무료요약 있음

블로그 삽화, 기술 도표, 비교 그림, 만화, 아이콘 등을 용도에 맞는 절차로 제작합니다. 구도와 색상, 이미지 모델을 정하고 검토용 이미지를 출력합니다.

  • 블로그 제목 이미지를 만들 때
  • 시스템 구조를 그림으로 설명할 때
  • 비교나 연대표를 시각화할 때
danielmiessler/LifeOS2만2026년 10월 28일 업데이트

ArtDirection

무료요약 있음

브리프와 제작 기준에 따라 이미지, 영상, 슬라이드, 사이트 화면 캡처의 시각 품질을 평가합니다. 두 비전 심사자가 점수와 결함 우선순위를 제시하고, 정해진 횟수 안에서 수정을 돕습니다. 평가를 통과한 결과물만 전달할 수 있으며, 사람의 점수와 의견은 별도 기록해 심사 보정에 활용합니다.

  • 이미지 수정 항목의 우선순위 정리
  • 기준에 따라 영상이나 슬라이드 평가
  • 공개 전 시각 품질 점검
danielmiessler/LifeOS2만2026년 10월 28일 업데이트

ArXiv

무료요약 있음

주제, 연구 분야, 논문 ID로 arXiv 논문을 찾고 제목, 저자, 초록, 링크를 정리합니다. 새 논문을 확인하고, 제공되는 경우 AlphaXiv의 AI 생성 개요도 가져옵니다.

  • AI·머신러닝 분야의 새 논문 확인
  • 특정 주제의 논문 검색
  • 논문 ID나 arXiv 주소로 조회
danielmiessler/LifeOS2만2026년 10월 28일 업데이트

danielmiessler의 스킬 모두 보기

이 스킬의 문제 신고