kanzo
Self-hosted, sharable kanban for humans and agents. One 4.5 MB binary, 4.5 MB of RAM, 10 to 60 tokens per agent reply, starts in 2 ms, zero setup.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗GitHub Pages(정적 사이트) + Supabase(DB)로 동작하는 나무위키 스타일 위키입니다. 회원가입 없이 누구나 문서를 읽고 사이트 안에서 바로 편집할 수 있습니다.
문서 보기 / 편집 / 새 문서 만들기
글쓰기 화면 같은 편집기: 마크다운 기호 없이 적용된 모습 그대로 보면서 편집(WYSIWYG)
--- 은 화면에 보이지 않음)[[문서 링크]], [* 각주] 도 그대로 유지됨| 단축키 | 동작 | 단축키 | 동작 |
|---|---|---|---|
Ctrl+B | 굵게 | Ctrl+K | 링크 |
Ctrl+I | 기울임 | Ctrl+Shift+F | 각주 |
Ctrl+Shift+X | 취소선 | Ctrl+Alt+2/3/4 | 제목 1/2/3 (0 은 본문) |
Tab / Shift+Tab | 목록 들여쓰기·내어쓰기, 표에서는 다음·이전 칸 |
Mac에서는 Ctrl 대신 Cmd.
이미지 올리기 (Supabase Storage): 툴바 이미지 버튼에서 사진을 고르거나, 편집창에 끌어다 놓기·붙여넣기(캡처 포함). PNG/JPG/GIF/WEBP 5MB 이하, 긴 변이 1600px 을 넘으면 자동으로 줄여서 올림. 프로필 상자에도 사진 올리기 버튼이 있음
친구 전용(초대 링크 + 기기 등록): 켜면 초대받아 등록된 기기만 문서를 읽고 쓰고 사진을 올릴 수 있음. 1회용 초대 링크를 처음 연 기기가 서버에 등록되어 이후 계속 입장하고, 사람별로 막을 수 있음. 서버(DB)가 확인하므로 사이트 주소만 알아서는 읽을 수 없음. 켜기 전에는 누구나 쓸 수 있음
사진 접기·크게 보기: 문서 속 사진은 높이 480px까지만 보이고, 누르면 전체 화면으로 크게 봄(원본 열기 링크 포함). 사진 하나하나를 접어서 보기로 설정하면 🖼 설명 ▸ 펼치기 한 줄로 줄어 문서가 길어지지 않음. 편집기에서 사진을 누르면 설명 수정·접기 설정·삭제를 할 수 있고, 이미지 창에도 "접어서 보여주기" 체크가 있음. 저장 형식은 
앱으로 설치(PWA): 홈 화면에 추가해 주소창 없이 앱처럼 실행. 한 번 열어 본 문서는 인터넷이 없어도 읽을 수 있음 (편집·검색·사진 올리기는 연결 필요)
프로필 상자(인포박스): 인물·작품·단체 문서 오른쪽 위에 사진과 정보 표를 보여 줌. 편집기의 삽입 → 프로필 상자에서 양식(인물/작품/단체)을 골라 만들고, 만든 상자를 눌러 고칠 수 있음. 본문에는 :::infobox ... ::: 블록으로 저장되어 검색·역링크·편집 기록이 그대로 동작
편집 기록(역사), 판 보기, 두 판 비교(diff), 이전 판으로 되돌리기
편집 충돌 감지 (내가 편집하는 사이 다른 사람이 저장하면 알려 줌)
편집자 닉네임 + IP 일부(예: 1.2.*.*) 기록
[[문서 링크]], [[문서#섹션|표시 글자]], 빨간 링크(없는 문서), [* 각주], 자동 번호 목차
분류(categories:), 넘겨주기(redirect:), 역링크, 최근 변경, 전체 문서, 랜덤
제목 자동완성 + 본문 검색, 다크 모드, 모바일 대응
index.html, assets/ — 정적 프론트엔드 (빌드 불필요). 편집기는 assets/editor.jsassets/config.js — 사이트 이름, Supabase URL, 공개용(publishable) 키supabase/migrations/ — DB 스키마 (적용 완료)supabase/seed.sql — 초기 예시 문서공개용 키는 브라우저에 노출됩니다. 그래서 DB 쪽에서 권한을 제한했습니다.
edit_page() 함수로만 가능합니다.edit_page() 가 제목·길이 검증, 충돌 검사, IP당 분당 15회 제한, 차단 목록 확인을 합니다.1.2.*.*)과 솔트 해시만 저장하며 해시는 API로 읽을 수 없습니다.동작 방식 (sw.js):
index.html, assets/*, 아이콘): 기기에 저장해 빠르게 엶. index.html 은 인터넷 우선이라 배포하면 바로 새 버전이 열림. assets/* 는 저장본을 먼저 보여 주고 뒤에서 갱신.관리할 때:
index.html 의 ?v=숫자 는 assets/* 를 바꿀 때마다 올려 주세요 (바로 새 파일을 받게 하는 용도).sw.js 의 동작을 바꾸면 VERSION 도 올려 주세요.assets/icons/ 의 PNG(192, 512, maskable 512, 애플 180)를 같은 이름으로 바꾸면 됩니다. 이름·색은 manifest.webmanifest.기본 사용법(공유 코드): 친구들이 같이 쓰는 코드 하나를 정해 단톡방에 올립니다. 친구는 입장 화면에 코드를 넣거나 https://<사용자>.github.io/<저장소>/#/join/<코드> 링크를 열면 되고, 한 번 들어온 기기는 계속 들어옵니다 (기기마다 한 번).
select private.set_access_code('kq7m-x3vn-p9tb'); -- 코드 정하기 / 바꾸기 (켜기도 함께, 8자 이상 · 12자 이상 무작위 권장)
select private.clear_access_code(); -- 공유 코드 끄기 (등록된 기기는 그대로)
select private.gate_off(); -- 친구 전용 끄기 (다시 누구나 사용)
코드는 대소문자·공백·하이픈을 무시하고 해시로만 저장됩니다. 코드를 바꾸면 모두 새 코드를 다시 입력해야 합니다. 특정 사람만 막고 싶을 때는 아래 기기 초대를 함께 쓰세요.
웹 사이트는 기기의 MAC 주소를 읽을 수 없습니다(브라우저가 알려 주지 않고, 폰은 MAC 을 무작위로 바꿉니다). 대신 같은 효과를 이렇게 냅니다.
동작 방식: 브라우저가 모든 요청에 x-wiki-code 헤더로 기기 토큰(또는 공유 코드)을 실어 보내고, DB가 확인합니다 (private.has_access()). 허가가 없으면 문서·역사는 빈 목록으로 보이고, 저장과 사진 올리기는 거절됩니다.
Supabase SQL Editor에서 실행:
select private.gate_on(); -- 친구 전용 켜기 (등록된 기기만 입장)
select private.create_invite('명성아'); -- 1회용 초대 토큰 만들기 (이때 한 번만 보임, 7일)
select private.create_invite('홍우택', 14); -- 유효기간 14일
-- 초대 링크: https://windowhyun.github.io/WangbamBBangwiki/#/join/<위에서 나온 토큰>
select id, name, created_at, last_seen, revoked_at, user_agent, ip_label from private.devices order by id; -- 등록된 기기
select name, created_at, expires_at, used_at from private.invites order by id; -- 초대 현황
select private.revoke_device(3); -- 기기 막기 (devices.id)
select private.gate_off(); -- 모두에게 다시 열기 (공유 코드도 함께 지움)
select private.set_access_code('kq7m-x3vn-p9tb'); 로 모두가 같이 쓰는 코드를 둘 수도 있습니다 (입장 화면에 직접 입력, 8자 이상·12자 이상 무작위 권장). 등록된 기기는 공유 코드와 상관없이 들어옵니다. select private.clear_access_code(); 로 공유 코드만 끄면 등록된 기기만 남습니다.revoke_device 로 막으세요.이미지 올리기 제한: IP당 분당 8장 / 하루 100장, 전체 하루 1000장 (private.allow_image_upload() 의 숫자를 고치면 조정). 올린 사람은 서버 기록(private.upload_log)에 IP 해시와 파일 이름으로 남음.
문제 이미지를 올린 사람 차단 (파일 이름으로 IP 해시를 찾아 차단 — 문서 편집과 이미지 업로드가 함께 막힘):
insert into private.blocked_ips (ip_hash, reason)
select ip_hash, '이미지 장난' from private.upload_log where object_name = '2026/10/파일이름.png'
on conflict do nothing;
이미지 파일 삭제는 Supabase 대시보드 Storage → wiki-images 에서 합니다. (문서에서 쓰이지 않는 이미지도 자동으로 지워지지는 않음)
문서 보호 / 보호 해제:
update public.pages set protected = true where title = '대문';
장난 편집 되돌린 뒤 작성자 차단 (revisions 의 id 로 IP 해시를 찾아 차단):
insert into private.blocked_ips (ip_hash, reason)
select ip_hash, '장난 편집' from public.revisions where id = 123
on conflict do nothing;
문서 삭제 (역사도 함께 삭제됨):
delete from public.pages where title = '지울 문서';
Supabase 무료 플랜은 일정 기간 요청이 없으면 프로젝트를 자동으로 일시정지하고, 그동안 사이트는 "오프라인"으로 보입니다.
.github/workflows/keep-supabase-alive.yml 이 매일 한 번 DB 함수(check_access)를 호출해 정지를 막습니다.
assets/config.js 에서 읽으므로 Secrets 등 따로 설정할 것이 없습니다. Supabase 프로젝트를 옮기면 config.js 만 바꾸면 됩니다.Keep Supabase alive → Run workflow 로 바로 실행해 볼 수 있습니다. 응답이 없으면 실패(빨간색)로 표시됩니다.supabase/migrations/ 를 파일 이름 순서대로 적용합니다 (SQL Editor 또는 supabase db push).supabase/seed.sql 로 예시 문서를 넣습니다.assets/config.js 의 supabaseUrl, supabaseKey 를 새 프로젝트 값으로 바꾸고, index.html 의 ?v=숫자 를 올립니다.main 에 병합합니다.Deploy from a branch, Branch main / / (root).https://<사용자>.github.io/<저장소>/ 에서 확인합니다.빌드가 없는 정적 사이트라 그대로 올라갑니다 (모든 경로가 상대 경로라 주소가 / 든 /저장소/ 든 동작).
vercel.json / .vercelignore 가 헤더와 제외 파일(supabase/)을 정해 줍니다.https://<프로젝트>.vercel.app 에서 확인합니다. 이후 main 에 푸시하면 자동 배포됩니다.Supabase 쪽은 따로 설정할 것이 없습니다 (로그인을 쓰지 않아 허용 주소 설정이 필요 없고, API 는 어느 주소에서든 호출됩니다). 주소가 바뀌어도 친구 전용 접속 정보(코드·등록 기기)는 브라우저 저장소에 있어서 주소(도메인)마다 따로입니다. 새 주소에서는 다시 한 번 코드를 입력해야 합니다. GitHub Pages 와 Vercel 을 동시에 켜 두어도 같은 DB 를 보므로 문서는 똑같이 보입니다. 하나만 쓰려면 다른 쪽을 끄세요.
로컬 확인: python3 -m http.server 8000 후 http://localhost:8000