threads-to-reels
SkillMediaLets your agent turn performance posts into Instagram Reels by matching iPhone photos, adding narration, and rendering video.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the threads-to-reels skill
About this capability
Read this when making Instagram Reels from BamBam's Threads performance posts with iPhone photos attached. Covers topic selection, photo matching, narration, 하이퍼프레임스 assembly, safe zones, sound mixing, and the publishing path.
What this skill tells your AI
The instructions your AI receives, as published by bam-bam-2/solo-skills in skills/threads-to-reels/SKILL.md and read by ahel’s review.
이 스킬이 시스템에 하는 일 (설치 전 확인)
- 로컬 사진·영상 파일을 읽고 새 영상 파일을 만듭니다. 원본은 수정하지 않습니다.
ffmpeg을 로컬에서 돌립니다. CPU를 많이 씁니다.- 발행은 자동으로 하지 않습니다. 결과 파일만 만듭니다.
스레드 → 인스타 릴스
밤밤의 스레드 성과글을 소재로 잡고, 아이폰 사진 라이브러리에서 그 시기 사진을 찾아 붙여
인스타 릴스(1080×1920)를 만든다. 발행 계정은 get100.official.
무거운 작업(렌더·전사·학습)은 전부 맥미니에서 돌린다. 맥북에어엔 ffmpeg도 Pillow도 없다.
ssh -o BatchMode=yes mac-mini
0. 나레이션은 밤밤이 직접 읽는다 (기본값)
보이스 클론으로 만들지 말 것. 2026-08-15에 제로샷과 파인튜닝을 다 실측했고 둘 다 반려됐다.
근거와 수치는 볼트 개념/보이스 클로닝.md.
대본이 정해지면 이렇게 요청한다.
밤밤님, 이거 이렇게 읽어주세요 (대본) 아이폰 음성메모로 녹음하고, 녹음 후 앱을 한 번 열어두면 맥미니로 자동 동기화됩니다. 문장 사이 1초씩 쉬어주세요. 틀리면 그 문장만 다시 읽으면 좋은 테이크만 골라 씁니다.
녹음이 오면 ~/voicememo/inbox/ 에서 최신 파일을 집어 문장 단위로 자르고 정렬한다.
1. 소재 선정
~/Projects/ops/threads-tool/.env 토큰으로 글 인사이트를 전량 수집해 성과 상위를 뽑는다.
주의: 성과 1위 글이 그 시점 사진을 갖고 있지 않을 수 있다. 소재 후보와 사진 보유량을
같이 보고 고른다(실제로 1위 글은 사진 0장, 차순위 글이 ±3일에 49장이었다).
2. 사진 매칭
이 맥의 Photos Library.photoslibrary 가 아이폰과 실시간 동기화된다(사진 약 1.5만 장).
Photos.sqlite로 촬영일시·GPS·미디어종류 필터링. 애플이 계산해둔 미학 점수도 들어있다- 로컬 캐시본이 최대 1536×2048이라 iCloud 원본 없이도 릴스 화질이 나온다
- 비전 모델의 분류 라벨만 믿지 말 것. 캡션 텍스트·사진 속 시각 단서·장수를 삼각 검증한다
- 발행 전 개인정보 검수 필수: 명찰(실명+직업), 명함(실명+전화+이메일)이 읽히는 클로즈업은 전부 제외한다. 풀해상도로 확대해서 확인할 것
3. 영상 조립 — 하이퍼프레임스
HeyGen의 오픈소스 HyperFrames(HTML→MP4, Apache 2.0). npx -y hyperframes@latest
lint 조판 검증 (한글 @font-face 누락, GSAP 트윈 충돌 등을 실제로 잡아준다)
render MP4 렌더 (37초물 기준 약 1분)
beats 음악 비트 감지
빌드 스크립트 원본: ~/Projects/ops/offload/jobs/build_v5.py
GSAP 함정 2개 (둘 다 실제로 밟았다)
fromTo는immediateRender기본값 때문에 타임라인 생성 즉시 from 상태가 적용된다. 플래시 오버레이가 영상 전체를 덮는 사고가 났다. 오버레이류는immediateRender:false+tl.set(..., 0)으로 초기화할 것- CSS에서 부모가
visibility:hidden인데 자식만 트윈시키면 아무것도 안 보인다. 부모 컨테이너에tl.set(parent,{autoAlpha:1})을 세그먼트 시작 직전에 넣는다
4. 세이프존 (필수 검수)
인스타 릴스 UI가 덮는 영역: 상단 220 / 하단 460 / 우측 140px.
자막은 화면 55~62% 지점(top:1090px 안팎)에 놓는다. 하단은 캡션·음원이 덮고 터치존이다.
렌더 후 위험영역을 반투명 빨강으로 덮은 검수 시트를 만들어 겹침을 눈으로 확인하고 보고한다.
자세한 근거: 볼트 개념/숏폼 세이프존.md
5. 디자인 — GET100 네오브루탈리즘
겟백 홈페이지 실제 CSS에서 뽑은 값만 쓴다. 감으로 만들지 말 것.
블랙 #0d0d0d · 오프화이트 #f5f5f0 · 라임 #d4f000 · 퍼플 #7b2fff
Pretendard (700/800/900) · border-radius 0 · 하드 오프셋 섀도우 (blur 0)
구성: 훅 타이포 슬램 → 챕터 넘버 뱃지(라임 사각 + 키워드 카드) → 라임 박스 카라오케 자막 → 그레인 + 프로그레스바 → 엔드카드(취소선 대비 + GET100 뱃지). 컷은 1.5~2.2초. 4초대로 하면 슬라이드쇼로 보인다.
6. 사운드
- BGM: Mixkit(무료 상업용, 저작자표시 불필요).
https://assets.mixkit.co/music/<id>/<id>.mp3librosa로 BPM·온셋펀치·저음비를 재서 고른다. 말 위에 얹을 거라 펀치는 있되 과하지 않게 - SFX: ffmpeg으로 합성한다(라이선스 프리). 위시=핑크노이즈+밴드패스, 히트=저음 사인+감쇠, 팝=고음 클릭, 라이저=노이즈 스윕
- 믹스: 나레이션을 키로 사이드체인 컴프레서로 BGM을 눌러준다.
최종
loudnorm=I=-14:TP=-1(인스타 기준). 스크립트:~/Projects/ops/offload/jobs/mix5.sh
7. 발행
~/Projects/getback/.env 의 IG_TOKEN/IG_USER_ID 로 Graph API media_type=REELS.
권한·한도(24시간당 100건) 실증 완료.
단 API 발행은 인스타 인기 음원을 못 붙인다. 도달에서 음원 비중이 크므로 "완성본을 폰으로 보내 앱에서 음원만 얹는 반자동"이 유효한 대안이다. 어느 쪽인지 밤밤에게 확인. Meta가 영상을 공개 URL에서 직접 받아가는 구조라 임시 호스팅이 필요하다(맥미니 8765는 테일스케일 내부망이라 불가).
검수 체크리스트
- 자막·뱃지·엔드카드가 전부 세이프존 안에 있나 (오버레이 시트로 확인)
- 사진에 제3자 실명·연락처가 읽히는 것이 없나 (풀해상도 확대)
- 나레이션이 BGM에 안 묻히나 (최종 믹스를 역전사해서 전 문장 인식 확인)
- 컷당 1.5~2.2초인가
- lint 0 error
Signals
- GitHub stars
- 365
- Forks
- 90
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
threads-to-reels- Source
- github.com/bam-bam-2/solo-skills