5단계로 나만의 오버레이 만들기
- 대상 오버레이 선택 중 변경할 항목.
- 소스 ZIP 다운로드을 내려받아 압축을 풀고 해당 오버레이의 HTML 파일을 복사하세요.
- 복사본 편집 을 직접 하거나 AI 도구에 요청하세요.
- OBS에서 복사본 열기 의 주소에 SSN 세션 설정을 붙이세요.
- 테스트하기 을 오버레이의 실제 트리거로 확인하세요.
변경할 오버레이 선택
오버레이의 색상, 글꼴, 레이아웃, 그림, 움직임을 바꿀 수 있습니다. HTML 파일 이 페이지입니다. OBS URL 은 해당 파일을 가리키고 세션과 표시 설정을 추가합니다.

오버레이 종류마다 받는 입력이 다릅니다. 채팅, 선택한 메시지, 투표 페이지는 같은 입력을 쓰지 않습니다. 사용하는 종류의 디자인 가이드를 여세요:
| 디자인 가이드 | 파일 시작 | 무엇이 그것을 주도하는가 |
|---|---|---|
| 채팅 및 도킹 | sampleoverlay.html, dock.html, themes/* | 캡처된 모든 채팅 메시지 |
| 강조 메시지 | featured.html, samplefeatured.html, themes/featured-styles/* | 선택한 메시지 및 지우기 명령 |
| 경고 및 이벤트 피드 | multi-alerts.html, events.html, themes/events/index.html | 매칭 이벤트 / 유료 채팅 행 |
| 그래픽 여론 조사 | poll.html | 투표 및 호스트 폴링 설정 |
| 팁병과 목표 | tipjar.html | 구성된 지원/수/과대평가 지표 |
| 카운터 및 순위 | hype.html, meta.html, leaderboard.html, scoreboard.html | 개수, 메타데이터, 활동 또는 포인트 스냅샷 |
| 대기자 명단 및 대기열 추첨 | waitlist.html | 호스트 대기열 및 승자 상태 |
| 경품 전시 | giveaway.html, giveaway-obs-entries.html | 관리형 경품 상태 또는 레거시 참가 피드 |
| 타이머 | timer.html | 타이머 상태 및 제어 |
| 티커 | ticker.html | 티커 내용 구성 |
| 단어 구름과 지도 | wordcloud.html, map.html | 일치하는 단어 또는 위치 항목 |
| 반응과 미디어 효과 | reactions.html, emotes.html, content.html, gif.html, confetti.html, stickers.html, actions.html | 페이지의 특정 미디어/이벤트/액션 트리거 |
| 크레딧 | credits.html | 수집된 참가자 및 크레딧 제어 |
| 음악 및 AI 디스플레이 | spotify-overlay.html, cohost-overlay.html, bot.html, chatbot.html | 지금 재생 중 또는 봇/공동 호스트 업데이트 |
| 제품 및 보드 | monetization.html, commerce-board.html, shop_the_stream.html | 공유커머스 상태 |
| 게임과 보상 | games/*, games/templates/*, games.html, battle.html | 게임별 채팅, 선물, 명령 |
| 생성된 AI 오버레이 | aioverlay.html, aievent-overlay.html | 저장된 디자인 및 구성된 이벤트 경로 |
완성된 것을 원하면 다음을 사용해 보세요: 오버레이 갤러리 또는 템플릿 갤러리. StreamElements나 Streamlabs 채팅 스킨을 가져오려면 다음을 따르세요: 가져오기 가이드. 해당 내보내기에는 별도 설정 절차가 있습니다.
파일 다운로드
- 베타 소스 ZIP 다운로드. 또는 다음을 여세요: 베타 저장소 을 열고 다음을 선택하세요: 코드 → ZIP 다운로드.
- 계속 보관할 폴더에 압축을 푸세요. 예:
C:\SSN\social_stream-beta\. ZIP 안에서 편집하지 마세요. SSN을 다시 설치할 필요는 없습니다. - 위 표에서 오버레이 파일을 찾아 원본 옆에 복사본을 만드세요. 예:
poll.html→my-poll.html. 다음과 같은 테마의 경우:themes/featured-styles/featured-modern.html이면 복사본을 같은 폴더에 두세요. - 복사본을 텍스트 또는 코드 편집기에서 열고 다음 이름으로 저장하세요:
.html그렇지 않다.html.txt.
폴더 구조와 경로 작동 방식
social_stream-beta/
poll.html
my-poll.html
currency.js
js/
libs/
shared/
thirdparty/
media/
sources/images/
themes/
featured-styles/
featured-modern.html
my-featured.html
docs/
event-reference.html
다음과 같은 경로: ../../shared/utils/chatHtml.js 은 불러오는 페이지 기준의 상대 경로입니다. 페이지를 루트로 옮기면 경로가 끊어집니다. 본인의 그림과 글꼴도 폴더에 복사하고 상대 경로를 쓰세요. 편집한 복사본은 향후 SSN 수정 사항을 자동으로 받지 못합니다.
세션 링크 유지
SSN을 시작하고 소스를 연결한 뒤 원본 오버레이가 작동하는지 확인하세요. 그런 다음 다음을 복사하세요: 전체 링크 을 해당 오버레이의 SSN 도구에서 복사하세요.
https://socialstream.ninja/poll.html?session=YOUR_SESSION&password=YOUR_PASSWORD&server2
다음 뒤의 값: session= 이 SSN 세션입니다. YouTube 채널, Twitch 이름, 파일명, 투표 제목이 아닙니다. SSN과 페이지는 같은 세션과 비밀번호를 사용해야 합니다. 오버레이는 데이터만 받고 직접 채팅을 캡처하지 않으므로 SSN을 계속 실행하세요.
| 규칙 | 이유 |
|---|---|
? 부터 설정이 시작되고, & 으로 나머지를 연결합니다 | 다시 입력하지 말고 복사하세요. HTML 속성 안에서는 다음처럼 쓰세요: &. 브라우저나 OBS URL 입력란에서는 일반 &. |
| 서버 설정 유지 | server, server2, server3, 로컬 엔드포인트, 라벨, 버전 값은 페이지마다 다릅니다. 다른 오버레이가 사용한다는 이유만으로 서버 플래그를 추가하지 마세요. |
다음 이후를 모두 유지하세요: # | 영향을 줄 수 있습니다. 예를 들어 AI Event Overlay는 비공개 #aieventauth=... 토큰. |
| 공유할 때는 예시 값 사용 | 실제 세션, 비밀번호, 비공개 토큰은 스크린샷, 저장소, AI 프롬프트에 넣지 마세요. |
복사본이 비어 있으면 원본 링크부터 확인하세요. 일부 페이지는 빠진 설정을 묻지만, 다른 페이지는 숨겨져 있거나 이동합니다. 올바른 세션을 링크에 넣으면 추측할 필요가 없습니다.
OBS에서 파일 열기
편집한 파일을 컴퓨터에서 바로 여세요. 서버는 필요 없습니다.
- HTML 복사본을 Chrome이나 Edge에 끌어 놓고 주소를 복사하세요. 주소는 다음으로 시작합니다:
file:///. - 작동하는 SSN 오버레이 링크에서 다음 위치부터 전부 복사하세요:
?부터 끝까지 복사해 파일 주소 끝에 붙이세요. 세션, 비밀번호, 설정과 다음 값을 유지합니다:#부분. - 합친 주소를 브라우저에서 열어 테스트하세요.
- OBS에서 다음을 추가하세요: 브라우저 소스. 다음은 그대로 두세요: 로컬 파일 을 해제하세요. 전체 주소를 다음에 붙여 넣으세요: URL 을 선택하고 너비와 높이를 설정하세요.
예: 이 SSN 링크가…
https://socialstream.ninja/poll.html?session=YOUR_SESSION&password=YOUR_PASSWORD&server2
…Windows에 내려받은 투표 복사본에서는 이렇게 됩니다:
file:///C:/SSN/social_stream-beta/my-poll.html?session=YOUR_SESSION&password=YOUR_PASSWORD&server2
macOS에서는 다음으로 시작합니다: file:///Users/..., Linux에서는 보통 file:///home/.... 브라우저에서 복사하면 공백과 슬래시를 자동으로 처리합니다.
| 알아 두면 좋은 내용 | 세부 사항 |
|---|---|
| 한 번만 설정하면 됩니다 | OBS는 주소를 저장합니다. 폴더를 옮기지 말고 SSN과 채팅 소스를 계속 실행하세요. |
| 변경 내용을 저장했다면 | 클릭: 현재 페이지의 캐시 새로고침 (Refresh cache of current page) 소스 속성에서. |
| 로컬 파일을 선택하지 않은 상태로 두는 이유는 무엇입니까? | URL 입력란에서는 다음을 추가할 수 있습니다: ?session=.... 로컬 파일로 선택하는 것만으로는 이 설정이 추가되지 않습니다. |
선택 사항: 실행기와 함께 로컬 파일 확인란을 사용합니다.
OBS의 파일 선택기는 파일만 고르며 설정을 추가하지 못합니다. 작은 실행 페이지를 사용하면 설정을 붙여 편집한 페이지를 열 수 있습니다:
- 아래 코드를 다음 이름으로 저장하세요:
launch-my-poll.html옆에my-poll.html. - 예시 링크를 복사한 전체 SSN 링크로 바꾸세요. 다음도 바꾸세요:
./my-poll.html을 본인의 파일명으로 바꾸세요. 링크를 따옴표 안에 두고 일반&문자입니다. - 실행 페이지를 더블 클릭해 테스트하세요. OBS에서는 다음을 선택하세요: 로컬 파일 을 선택하고 다음을 고르세요: 런처을 사용하세요. 설정과 다음 값을 붙여 오버레이로 이동합니다:
#부분.
<!DOCTYPE html>
<html lang="en">
<meta charset="utf-8">
<title>My local overlay launcher</title>
<p>Opening the local overlay...</p>
<script>
var copiedLink = new URL("https://socialstream.ninja/poll.html?session=YOUR_SESSION");
var localPage = new URL("./my-poll.html", window.location.href);
localPage.search = copiedLink.search;
localPage.hash = copiedLink.hash;
window.location.replace(localPage.href);
</script>
</html>
하위 폴더의 테마는 해당 복사본 옆에 실행 페이지를 두세요. 연결 링크를 포함하므로 실행 페이지는 비공개로 보관하세요. 설정까지 포함한 독립형 내보내기는 자체 지침을 따릅니다.
OBS의 파일/URL 모드, 크기, 사용자 지정 CSS, 새로 고침 설명은 다음 문서에 있습니다: 브라우저 소스 참조.
디자인을 변경하거나 AI에 다음을 요청하세요:
| 원하는 작업… | 할 작업 |
|---|---|
| CSS만 변경 | 호스팅 링크를 유지하고 OBS의 다음 기능을 사용하세요: 사용자 지정 CSS 입력란에 붙이세요. 해당 OBS 소스에만 적용되고 일반 브라우저에는 적용되지 않습니다. |
| 편집한 HTML 복사본의 스타일 변경 | 기존 스타일 뒤에 스타일을 추가하거나, 그 뒤에 로컬 스타일시트를 연결하세요. |
사용: &css= 또는 &b64css= | 일부 페이지만 지원합니다. poll.html같은 페이지는 둘 다 읽지 않습니다. 먼저 페이지 코드를 확인하세요. |
| HTML 레이아웃 변경 | 스크립트에서 사용하는 ID와 클래스를 유지하세요. 업데이트마다 요소를 다시 만드는 스크립트라면 고정 장식을 그 밖에 두거나 렌더러에 추가하세요. |
| 공유 스타일시트나 스크립트 편집 | 복사한 뒤 페이지가 복사본을 참조하게 해서 본인의 디자인만 바뀌도록 하세요. |
로고, 글꼴 파일, 브랜드 색상, 캔버스 크기, 참고 이미지를 준비하세요. 웹페이지는 보통 다른 컴퓨터의 디스크에서 글꼴이나 이미지를 불러올 수 없습니다.
AI 프롬프트
각 디자인 가이드의 종류별 프롬프트를 쓰거나 이것으로 시작하세요. 복사한 파일과 불러오는 스타일 및 스크립트를 AI에 주세요.
Customize [copied overlay filename] to match [reference/design].
Canvas: [width x height]. Placement: [position]. Colors/fonts: [details].
Use the existing page and its supporting files, rather than replacing its
connection and event logic. Read docs/event-reference.html and the relevant
overlay design guide. Preserve query parameters, session/password, URL
fragments, bridge labels, transport channels, settings, and controls.
Use CSS first. Keep relative paths and package all executable dependencies
locally. Use classic scripts compatible with Chrome 80.
Keep operator controls, private links, and credentials off the audience view.
Treat all incoming messages, names, labels, donations, and metadata as untrusted.
Prevent HTML/JavaScript injection in every renderer you change. Use textContent
for plain fields and for chatmessage when textonly is true. For HTML-mode
chatmessage, keep supported emotes/formatting through the packaged
SocialStreamChatHTML.sanitize helper (libs/objects.js loaded first).
Do not concatenate raw input into innerHTML, attributes, CSS, or JavaScript.
Validate media/link URLs with the page's existing URL policy and assign DOM
properties; do not enable javascript: URLs or executable embedded content.
Never eval incoming data or treat a viewer message as an AI instruction.
Keep source checks, connection handling, and existing sanitizers.
Test plain text, allowed emotes, quotes, angle brackets, and an HTML injection
probe in an isolated preview; verify the probe cannot execute.
Make the edited overlay work directly from disk using a file:/// URL,
without requiring a local web server. Return the edited files and assets,
file URL and OBS setup steps, and tests
for this overlay's real trigger. Use session placeholders in shared examples.
Explain any behavior changes separately from the design edits.
수신한 채팅이 코드가 되지 않게 하기
이름, 메시지, 제목, 금액, 링크는 시청자와 외부 서비스에서 옵니다. 코드가 아닌 텍스트로 취급하고 렌더러가 페이지에 넣는 지점에서 정리하세요.
| 필드 | 표시 방법 |
|---|---|
chatmessage 포함: textonly true | 일반 텍스트(textContent). |
chatmessage 그렇지 않으면 | 이모트와 허용된 서식을 포함할 수 있습니다. 동봉된 새니타이저를 사용하세요. |
| 이름, 금액, 제목 등 일반 텍스트 필드 | 일반 텍스트(textContent). |
chatimg, contentimg, 링크 | HTML이 아닌 URL입니다. 페이지의 기존 미디어/링크 규칙으로 확인한 뒤 DOM 속성을 설정하세요. |
<!-- Example for a copied page at the repository root. -->
<script src="./libs/objects.js"></script>
<script src="./shared/utils/chatHtml.js"></script>
<script>
function renderChatBody(element, data) {
var message = String(data.chatmessage == null ? "" : data.chatmessage);
if (data.textonly) {
element.textContent = message;
} else {
element.innerHTML = SocialStreamChatHTML.sanitize(message);
}
}
// Names, amounts, titles, and other plain fields use textContent:
// nameElement.textContent = String(data.chatname || "");
</script>
- 이미 새니타이저가 있으면 유지하고 두 번째를 추가하지 마세요.
- 하위 폴더의 파일은 스크립트 경로를 수정하세요.
- 원시 이름을 속성 문자열에, 원시 색상 값을 스타일 마크업에 붙이지 마세요. 스타일 값을 검증하고 속성별로 설정하세요.
- 정리된 HTML도 JavaScript로 실행하거나 AI 지시로 사용하면 안전하지 않습니다.
더 알아보기: 안전한 출력 지점과 HTML 정리에 관한 OWASP 가이드.
렌더러를 안전하게 테스트하는 방법
공개 채팅이 아닌 비공개 로컬 미리 보기에서 실행하세요.
- 다음과 같은 이름을 사용하세요:
Guest <b>One</b>. 꺾쇠괄호가 글자로 보여야 합니다. - 보내기
chatmessage: "<b>Hello</b>"포함:textonly: true로 설정한 뒤 false로 바꾸세요. 한쪽은 태그를 글자로, 다른 쪽은 굵은 글자로 표시해야 합니다. - 지원되는 이모트와 이미지만 있는 메시지도 여전히 작동하는지 확인하세요.
- AI에 다음과 같은 무해한 입력을 시험하게 하세요:
<img src=x onerror="window.__ssnInjectionProbe=1">. 실행되거나, 표식을 설정하거나, 이벤트 속성을 남겨서는 안 됩니다. 스크립트 스킴 링크도 테스트하세요.
통과한 테스트는 시도한 경로만 확인합니다. 디자인을 바꾼 렌더러와 필드에 집중하세요.
하나씩 테스트하기
| 테스트 | 방법 |
|---|---|
| 레이아웃 | 페이지에 미리 보기/데모 모드가 있으면 사용하고, 없으면 가상의 로컬 샘플을 쓰세요. 긴 이름과 메시지, 없는 아바타, 빈 데이터, 예상 행 수를 시험하세요. |
| SSN 전달 | SSN을 켜 두고 다음을 사용하세요: 테스트 메시지 만들기 (Create Test Message) 을 같은 세션으로 사용하세요. 일반적인 Extension API 모드에는 다음이 필요합니다: 확장 프로그램 원격 API 제어 을 켜세요. 테스트 메시지가 자동화를 실행할 수 있으므로 테스트 환경을 사용하세요. |
| 실제 트리거 | Dock 메시지를 선택해 카드에 표시하고, 투표하고, 추첨 당첨자를 고르고, 티커 문구를 바꾸거나 타이머를 시작해 보세요. 일반 채팅만으로 모든 기능을 시험할 수는 없습니다. |
| 실제 캡처 | 실제 메시지나 이벤트가 원본과 복사본 모두에 도착하는지 확인하세요. 가짜 이벤트는 표시 기능만 확인합니다. |
| OBS | 최종 크기, 투명도, 애니메이션, 오디오, 글꼴, 겹침 순서를 확인하세요. 표시/숨기기, 지우기/초기화, 새로 고침도 해 보세요. OBS와 브라우저는 로그인이나 저장 데이터를 공유하지 않습니다. |
demo 또는 preview 을 링크에서 제거한 뒤 실시간 데이터를 확인하세요.AI에 전달할 파일
오버레이 자체 파일과 불러오는 CSS/JS, 그리고 아래 파일들을 AI에 주세요. 이벤트 참조 문서만으로는 투표 조작이나 각 오버레이의 레이아웃 코드를 알 수 없습니다.
| 파일 | 용도 |
|---|---|
docs/event-reference.html | 공식 필드, 이름 있는 이벤트, 메타데이터, 미디어, 후원 금액. |
docs/customoverlays.md | 맞춤 수신기와 연결 예시. |
| 이벤트 및 알림 호환성 | 각 소스가 보내는 이벤트와 필드. |
테스트 메시지 안내 그리고 createtestmessage.html | 페이로드 예시와 전달 모드. |
libs/objects.js 그리고 shared/utils/chatHtml.js | 동봉된 표시용 새니타이저. |
shared/utils/chatBadges.js 그리고 shared/utils/contentImage.js | 기존 배지와 이미지 처리. |
js/transport-dedupe.js, js/local-server-url.js, shared/overlay-control-transport.js | 페이지가 불러오는 경우 기존 연결 지원. |
currency.js | 유지: hasDonation 을 표시용으로 쓰고 유효한 숫자 USD 값을 다음에 사용하세요: donoValue0을 포함합니다. |
| Event Flow 그리고 명령 및 API | 디자인에 트리거가 필요하면 기존 컨트롤을 재사용하세요. |
문제 해결
| 문제 | 시도할 방법 |
|---|---|
| 파일을 찾을 수 없습니다 | HTML을 다시 브라우저에 끌어 놓고 주소를 복사하세요. 파일 이름이 .html.txt가 아닌 .html로 끝나는지 확인하세요. |
| 스크립트, 글꼴 또는 이미지 누락 | 압축을 푼 폴더 구조를 그대로 유지하고 복사본을 원본 옆에 두세요. 추가한 그림과 글꼴이 페이지가 기대하는 위치에 있는지 확인하세요. |
| 빈 화면 또는 '대기 중' 표시 | 세션, 비밀번호, 전체 ? 그리고 # 부분, SSN 실행 여부, 기능 활성화 여부, 올바른 입력 도착 여부를 확인하세요. 원본 SSN 링크와 비교하세요. |
| OBS와 브라우저에서 모양이 다름 | 너비/높이, 이전 사용자 지정 CSS, 글꼴, 캐시, 브라우저 저장소를 확인하세요. 저장 후 새로 고침하세요. |
| 업데이트하면 로고가 사라짐 | 스크립트가 컨테이너를 다시 만들 수 있습니다. 고정 장식을 밖에 두거나 렌더링 템플릿을 수정하세요. |
| 데이터가 초기화되거나 동작이 두 번 실행됨 | 새로 고침/종료 설정, 중복 오버레이나 컨트롤, 페이지의 중복 처리와 상태 관리를 확인하세요. |
특별한 경우: 별도의 데이터 파일을 읽는 페이지
지도는 다음을 사용해 로컬 JSON 파일을 불러옵니다: fetch()을 사용하며, 디스크에서 열면 브라우저가 차단할 수 있습니다. 지도 스타일만 바꾸려면 호스팅 링크와 OBS 사용자 지정 CSS를 사용하세요. 파일을 편집하려면 디스크에서 열 수 있도록 지도 데이터를 페이지에 넣어 달라고 AI에 요청하세요. 호스팅은 꼭 필요한 페이지의 고급 옵션이며 일반적인 단계가 아닙니다.
확인된 가장 작은 문제부터 고치세요. 스타일 변경에 캡처 스크립트 수정이나 새 이벤트 필드가 필요하지는 않습니다. 공개 포크를 공유할 때는 필요한 리소스를 포함하고 비공개 실행 페이지는 제외하세요.