尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗브라우저(iPad Safari 등)에서 쓰는 네컷 사진 부스 웹앱입니다. 카메라로 여러 장을 연속 촬영하고, 프레임에 합성해 저장·인쇄합니다.
| 주소 | 내용 | 광고 |
|---|---|---|
/ | 메인 페이지 (소개 · 사용법 · 자주 묻는 질문) | 구글 애드센스 3곳 |
/booth | 촬영 부스 (홈 화면에 추가하면 바로 여기로 열림) | 없음 |
/privacy | 개인정보처리방침 (애드센스 쿠키 안내) | 없음 |
/en · /ja · /zh (+ /booth, /privacy) | 영어 · 일본어 · 중국어(간체) 페이지 | 메인만 |
/sitemap.xml · /robots.txt · /llms.txt | 검색엔진 · AI 검색용 | – |
/ads.txt | 애드센스 판매자 정보 | – |
한국어(기본)는 접두사 없는 주소, 다른 언어는 /en, /ja, /zh 아래에 있습니다. 문구는 src/i18n/messages/<언어>/에 있고, 한국어(ko)가 원본입니다. 다른 언어는 같은 구조를 따라야 빌드·테스트가 통과합니다.
vercel.json이 접속 IP의 나라(x-vercel-ip-country)를 보고 한국어 주소에서 언어 주소로 임시 이동(307)시킵니다. 한국 → 한국어, 일본 → 일본어, 중국·대만·홍콩·마카오 → 중국어, 그 밖 → 영어.npm run serve 등): 한국어 페이지의 인라인 스크립트가 브라우저 시간대로 나라를 짐작해 옮깁니다.lang 쿠키(1년)를 남기고, 그 뒤로는 자동으로 옮기지 않습니다.hreflang(+ x-default = 한국어)과 sitemap으로 언어별 주소를 알립니다.src/i18n/config.ts의 COUNTRY_LOCALE과 vercel.json을 함께 고칩니다(src/i18n/i18n.test.ts가 둘이 같은지 확인).public/og/og-<언어>.png, node scripts/og-images.mjs로 다시 만듦)WebSite, WebApplication(무료), FAQPage, HowTo — 화면의 자주 묻는 질문·사용법과 같은 문구/llms.txt, 화면에 보이는 "SnowCut이란?" 정의 문단NEXT_PUBLIC_SITE_URL=https://snowcut.vercel.app # 정식 주소 (기본값)
NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION=... # Google Search Console
NEXT_PUBLIC_NAVER_SITE_VERIFICATION=... # 네이버 서치어드바이저
게시자 ID(ca-pub-6532893388671562)는 코드에 기본값으로 들어 있습니다. 다른 값은 빌드할 때 환경 변수로 넣습니다(Vercel은 Project Settings → Environment Variables). NEXT_PUBLIC_ADSENSE_CLIENT를 빈 값으로 두면 광고를 끕니다.
광고는 기본으로 꺼져 있습니다. 관리자 모드에서 기기(브라우저)마다 켜고 끕니다.
NEXT_PUBLIC_ADSENSE_CLIENT=ca-pub-6532893388671562 # 애드센스 게시자 ID (기본값)
NEXT_PUBLIC_ADSENSE_SLOT_TOP=1111111111 # (선택) 직접 만든 디스플레이 광고 단위 data-ad-slot (소개 아래)
NEXT_PUBLIC_ADSENSE_SLOT_MIDDLE=2222222222 # (기능 소개 아래)
NEXT_PUBLIC_ADSENSE_SLOT_BOTTOM=3333333333 # (자주 묻는 질문 아래)
NEXT_PUBLIC_ADSENSE_SLOT_INTERSTITIAL=4444444444 # 다운로드·인쇄 전에 띄우는 광고 창의 광고 단위 (없으면 광고 창 없이 바로 실행)
ADMIN_PASSWORD=ab12cd34 # 관리자 모드 비밀번호 (8자리, NEXT_PUBLIC_ 아님)
snowcut.ads)에 저장됩니다. 값이 없으면 꺼짐입니다.ADMIN_PASSWORD는 빌드할 때 sha256("snowcut-admin:" + 비밀번호)로 바꿔 넣으므로 평문은 사이트에 들어가지 않습니다. 다만 정적 사이트라 해시는 누구나 볼 수 있으니 추측하기 어려운 값을 쓰세요. 값이 없거나 8자리가 아니면 관리자 모드에서 "비밀번호가 설정되지 않았습니다"가 나오고 로그인할 수 없습니다. 바꾼 뒤에는 다시 배포해야 합니다.NEXT_PUBLIC_ADSENSE_SLOT_INTERSTITIAL이 없으면 광고 창 없이 바로 실행합니다./booth 페이지를 제외하세요.<meta name="google-adsense-account"> 태그와 /ads.txt로 합니다./ads.txt는 NEXT_PUBLIC_ADSENSE_CLIENT 값으로 빌드할 때 만들어집니다.기본으로 꺼져 있어서 카드와 버튼에 준비중인 기능입니다. 가 표시됩니다. 켜려면 NEXT_PUBLIC_ENABLE_CHARACTER=1로 빌드합니다(아래 누끼 서버 설정도 필요).
시작 화면의 커스텀 캐릭터 카드에서 이미지를 올리고, 남길 캐릭터 위를 눌러 점을 찍은 뒤 누끼 따기를 누르면 배경이 지워진 캐릭터가 프레임 위에 올라갑니다. 끌어서 옮기고, 두 손가락(또는 마우스 휠)·슬라이더로 크기와 회전을 바꾸며, 좌우 반전·흰 테두리(스티커)·맨 앞으로·삭제를 할 수 있습니다. 결과 화면 옵션 단계에서 실제 사진 위에 놓고 다시 고칠 수 있고, 저장·인쇄 이미지에 함께 들어갑니다.
배경 제거는 Background-Remover(FastAPI + SAM 2.1)를 따로 띄워 두고 그 API(POST /background-removal/remove, image + points=[[x,y],...] → 투명 PNG)를 부릅니다. 코드는 가져오지 않고 HTTP로만 연동합니다(그 저장소에는 라이선스 파일이 없습니다).
# 1) 누끼 서버 실행 (NVIDIA GPU 권장, CPU면 한 장에 20~30초). 자세한 방법은 그 저장소의 README.
git clone https://github.com/Daek-You/Background-Remover.git && cd Background-Remover
docker compose -f docker-compose-local.yml up --build # 기본 포트 5000
# 2-a) 개발: 앱이 서버를 직접 부른다. 서버 config/environments.py의 CORS_ORIGINS에 앱 주소를 넣는다.
NEXT_PUBLIC_BG_REMOVER_URL=http://localhost:5000 npm run dev
# 2-b) 배포(server.mjs): 같은 주소의 /bg-remover/* 를 누끼 서버로 넘긴다. CORS·혼합 콘텐츠 걱정이 없다.
NEXT_PUBLIC_BG_REMOVER_URL=/bg-remover npm run build
BG_REMOVER_URL=http://127.0.0.1:5000 npm run serve
NEXT_PUBLIC_BG_REMOVER_URL이 없으면 누끼 버튼이 나오지 않고, 배경이 이미 투명한 PNG를 배경 그대로 쓰기로만 올릴 수 있습니다.Next.js 16(App Router, TypeScript) 앱이고 정적 파일로 내보냅니다(output: "export"). iPad Safari에서 HTTPS 주소로 열면 라이브 카메라와 카운트다운으로 촬영합니다.
npm install
npm run dev # http://localhost:3000 (메인), /booth (촬영)
npm test # 레이아웃·상태 단위 테스트
npm run build # out/ 에 정적 파일 생성
npm run serve # out/을 4173 포트로
http://localhost)로 엽니다.out/ 폴더를 올립니다. GitHub Pages처럼 하위 경로에 올릴 때는 NEXT_PUBLIC_BASE_PATH=/저장소이름 npm run build로 빌드합니다.src/
app/ layout(글꼴·메타데이터), page(메인), manifest, globals.css
app/booth/ 촬영 부스 페이지 (광고 없음)
app/privacy/ 개인정보처리방침
app/ads.txt/ ads.txt (빌드할 때 생성)
components/ Booth(화면 전환) · StartScreen · CaptureScreen · ResultScreen(꾸미기 4단계) · ShotThumb · AdSlot(메인 광고)
hooks/useCamera.ts 전면 카메라 연결, 백그라운드 복귀 처리, wake lock
lib/frame.ts 레이아웃 6종 (캔버스 크기·칸 좌표·장수)
lib/canvas.ts 촬영본 축소, 4컷 합성
lib/saveImage.ts 공유 시트 / 다운로드 저장
lib/recorder.ts 촬영 영상 녹화 (거울 모드 캔버스 → MediaRecorder)
lib/boothState.ts 화면·촬영 상태 리듀서
lib/frames.ts 프레임 디자인 21종 (캔버스로 그림)
lib/look/ 색 필터 (WebGL2 셰이더, CSS 필터 행렬)
lib/sound.ts 셔터 소리 (Web Audio)
lib/print.ts SELPHY 엽서 인쇄용 시트 (한 장에 1개 또는 2개)
lib/ads.ts 애드센스 설정 (환경 변수)
server.mjs out/ 정적 서버 (npm run serve)