尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证시민이 공공 예산 항목을 읽고 직접 조절해 링크로 공유하는 정적 웹사이트. 첫 캠페인: 모두의 AI 예산
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗사이트: https://budget.codefor.kr/
모두의 AI 예산 심의 — 국회가 심의하는 AI 예산, 시민도 직접 나눠 보고 따져 봅니다.
시민이 공공 예산 항목의 설명을 읽고, 직접 금액을 조절해 보고, 자기가 짠 예산을 링크로 공유하는 정적 웹사이트입니다. 첫 캠페인은 과학기술정보통신부의 2027년 AI 예산 정부안입니다.
campaigns/ 아래에 예산 항목 데이터 폴더를 추가하면 다른 예산도 같은 화면으로 다룰 수 있습니다.정적 파일 서버만 있으면 됩니다. ES 모듈을 쓰기 때문에 index.html을 파일로 바로 열지 말고 서버로 띄우세요.
Node.js가 있으면:
npx serve -l 8000 .
Python이 있으면:
python3 -m http.server 8000
Ruby가 있으면(Ruby 3.0부터는 webrick을 따로 설치해야 합니다):
gem install webrick
ruby -run -e httpd . -p 8000
그다음 브라우저에서 http://localhost:8000 을 엽니다.
#c=분야id:값,...)를 휴대폰에서는 공유 시트로 보내고, 공유 시트가 없으면 복사합니다. 값은 과기정통부 분류의 칸은 퍼센트, 그 분류에 없는 칸은 억 원 단위입니다. 이 링크를 열면 같은 예산이 그대로 보입니다.index.html 홈: 예산 조절 화면과 최근 글
favicon.svg 사이트 아이콘(apple-touch-icon.png는 홈 화면 아이콘)
og.png 링크 미리보기 이미지(1200×630)
CLAUDE.md 이 저장소에서 일할 때 지키는 규칙(반영·버전 번호·DB)
budgets/index.html 시민 예산안 페이지
deliberation/index.html 시민 심의(질문·제안) 페이지
src/main.js 홈의 예산 조절 화면
src/budget.js 예산 자료 읽기와 조절 값 계산 (홈과 게시판 페이지가 함께 씀)
src/posts.js 시민 예산안·심의 페이지
src/share.js GNB의 사이트 공유 버튼
src/board.js 게시판: 글 목록, 글쓰기 창, 질문·제안 모달 (Supabase REST API)
src/config.js Supabase 프로젝트 주소와 공개 키
src/style.css 스타일
supabase/migrations/ 게시판 DB 스키마와 권한 규칙(SQL)
campaigns/ai-2027/budget.json 2027년 AI 예산 데이터 (변환 스크립트가 만든다)
campaigns/ai-2027/descriptions.json 출처·분류 설명 (사람이 쓴다)
scripts/xlsx_to_json.py 원자료 엑셀을 budget.json으로 변환
scripts/bump_version.py 배포 전에 CSS·JS·JSON 주소의 버전 번호(?v=)를 한꺼번에 바꿈
원자료는 과학기술정보통신부가 이주희 의원실(국회)의 자료요구에 제출한 「AI 예산 현황」 엑셀입니다. 원자료 파일은 저장소에 넣지 않습니다. 설명을 고치거나 원자료가 바뀌면 다시 변환합니다(표준 라이브러리만 씁니다).
python3 scripts/xlsx_to_json.py <원자료.xlsx> campaigns/ai-2027/budget.json
src/config.js가 비어 있으면 게시판은 「준비 중」으로 보이고 나머지 화면은 그대로 동작합니다. 게시판을 켜려면 다음과 같이 합니다.
supabase/migrations/ 아래 SQL 파일을 순서대로 실행합니다. Supabase CLI를 쓰면 supabase link 뒤 supabase db push로 적용할 수 있습니다.src/config.js에 넣습니다. 이 키는 공개해도 되는 키입니다. secret(service_role) 키는 절대 넣지 마세요.운영 중인 프로젝트는 citizen-budget(peacecode 조직)이며 주소와 키가 src/config.js에 들어 있습니다.
권한 규칙은 SQL에 있습니다. 누구나 목록(posts_public 뷰)을 읽고, 익명 세션을 포함해 로그인한 사람만 글을 씁니다. 자기 글만 고치고 지울 수 있으며, 작성자 id는 공개하지 않습니다. 같은 세션은 10분에 5개까지 쓸 수 있습니다.
Supabase의 보안 점검(Advisors)은 posts_public을 「Security Definer View」로 표시합니다. 작성자 id를 읽을 권한 없이 내 글인지(mine)를 계산하려고 일부러 그렇게 만든 뷰이며, 숨긴 글은 뷰 안에서 직접 뺍니다.
부적절한 글은 Table Editor에서 posts 표의 hidden을 true로 바꾸면 목록에서 사라집니다. 스팸이 늘면 Authentication의 익명 가입 횟수 제한을 낮추거나 CAPTCHA를 켜는 것을 고려하세요.
로컬에서 시험하려면 Docker와 Supabase CLI로 supabase start를 실행하고, 출력된 API_URL과 publishable 키를 src/config.js에 잠시 넣습니다(커밋하지 마세요). supabase/config.toml은 로컬 스택 설정이며 익명 로그인이 켜져 있습니다.
저장소 루트를 그대로 GitHub Pages 같은 정적 호스팅에 올리면 됩니다.
CSS·JS·JSON을 고친 커밋을 올리기 전에는 버전 번호를 바꿉니다.
python3 scripts/bump_version.py
GitHub Pages는 파일을 브라우저에 10분 동안 캐시하게 해서, 배포 직후에는 새 HTML과 예전 CSS·JS가 섞여 화면이 깨질 수 있습니다. 이 스크립트는 HTML과 JS가 부르는 파일 주소의 ?v= 번호를 모두 지금 시각으로 바꿔, HTML이 늘 한 벌의 파일을 가리키게 합니다. 같은 모듈을 서로 다른 번호로 부르면 두 번 읽혀 따로 동작하므로 번호는 손으로 고치지 마세요. python3 scripts/bump_version.py --check는 모든 주소의 번호가 같은지 확인만 합니다.
사이트 주소는 budget.codefor.kr이며 루트의 CNAME 파일에 적혀 있습니다. 이 주소가 동작하려면 codefor.kr의 DNS에 다음 레코드가 있어야 합니다.
| 이름 | 종류 | 값 |
|---|---|---|
budget | CNAME | code-for-korea.github.io |
레코드가 퍼진 뒤 저장소 Settings → Pages에서 사용자 도메인이 budget.codefor.kr로 잡혔는지 확인하고 「Enforce HTTPS」를 켭니다. 다른 계정이 이 하위 도메인을 가져가지 못하도록 Code-for-Korea 조직의 Settings → Pages → Verified domains에서 codefor.kr을 확인해 두는 것을 권합니다.
권오현(Ohyeon Kweon, github.com/rest515)이 만들었습니다. 제안이나 고칠 점은 이 저장소의 이슈로 남겨 주세요.
함께 이야기하려면 코드포코리아 디스코드에 들어오세요.
MIT License, see LICENSE.