Show HN: Ledge.sh – Runnable Markdown Notes
Show HN: Ledge.sh — 실행 가능한 마크다운 노트
Ledge.sh는 마크다운 노트에 코드 블록을 넣고 실행 결과를 바로 기록하는 오픈소스 앱입니다. 노트별로 지속되는 셸을 제공하고 로컬이나 SSH 서버에서 명령을 실행하며, 파일 기반 저장과 모바일 앱, MCP 연동도 지원합니다.
- 주제
AI 요약
Ledge.sh는 명령어와 절차를 마크다운으로 정리하고, 노트 안에서 바로 실행하는 개발자·DevOps용 앱입니다. 코드 블록에서 ⌘↩을 누르면 실행 결과가 블록 아래에 표시됩니다. 명령은 노트마다 별도의 지속형 셸에서 돌아가므로 디렉터리 이동, 환경 변수 설정, 가상환경 활성화 상태가 다음 실행에도 이어집니다. 비밀번호 입력이나 대화형 프롬프트도 출력 패널에서 처리합니다.
실행 환경과 원격 서버
노트의 frontmatter에서 cwd:로 시작 디렉터리를, env:로 셸에 전달할 환경 변수를 지정합니다. norun을 붙이면 코드 블록을 실행하지 않도록 설정합니다. 노트에 host:를 지정하면 명령은 SSH를 통해 해당 호스트에서 실행되며, 노트 파일은 기존 위치에 남습니다. SSH 키, 에이전트, ~/.ssh/config, 2단계 인증은 평소 터미널과 같은 방식으로 사용합니다. 실행 전에는 코드와 대상 머신을 확인하고 승인하도록 합니다. Python, Node, Ruby, PHP 등 인터프리터 블록도 원격 호스트에서 실행할 수 있고, TypeScript는 앱에 포함된 Bun 런타임을 사용합니다.
서버에 Ledge를 설치하면 데스크톱 앱은 서버에 저장된 노트를 열어보고 편집하고 실행하는 창으로 동작합니다. iPhone과 iPad 앱도 같은 서버를 사용하며 기기에는 노트를 저장하지 않습니다. 휴대전화는 Secure Enclave에서 생성한 키로 서버에 연결합니다. 이 키는 Ledge에만 접근할 수 있습니다. S3 호환 버킷에 노트를 암호화해 매시간 백업하는 ledge backup도 제공합니다.
파일 중심 저장과 편집 기능
노트는 별도 데이터베이스가 아닌 일반 폴더 안의 마크다운 파일입니다. 따라서 iCloud Drive, Dropbox, Git, Syncthing 등 기존 파일 동기화 도구로 동기화할 수 있습니다. 프로젝트 폴더를 연결하면 기존 마크다운 파일을 옮기지 않고 노트로 열 수 있고, 실행 블록은 프로젝트 안에서 작동합니다. 연결을 해제해도 파일은 그대로 남습니다. Git 저장소에서는 노트를 커밋하고 푸시하는 명령을 실행할 수도 있습니다.
앱은 제목과 본문 검색, 위키 링크와 역링크, 태그, 즐겨찾기, 개요 패널, 템플릿을 지원합니다. 노트를 잠그면 본문을 디스크에 암호화해 저장하며, 잠금 상태에서는 에이전트가 본문을 읽거나 검색할 수 없습니다. 웹페이지나 Slack, Google Docs에서 복사한 내용을 마크다운 형식으로 붙여넣을 수 있고, 이미지도 파일로 저장합니다. 여러 패널을 나눠 열고 각 패널에서 탭을 관리할 수 있습니다.
CLI와 에이전트 연동
ledge CLI로 터미널에서 노트를 목록화하고, 읽고, 검색하고, 생성하거나 내용을 덧붙일 수 있습니다. 결과는 표준 출력으로, 대화형 메시지는 표준 오류로 보내 파이프와 함께 쓰기 쉽도록 했습니다. --json 옵션으로 기계가 읽을 형식도 출력합니다. Ledge는 MCP 서버도 제공합니다. claude mcp add ledge -- ledge mcp로 Claude Code에 연결하면 MCP 에이전트가 노트를 읽고 검색하고 생성하고 수정할 수 있습니다. prompt 코드 블록은 에이전트에 전달하는 프롬프트로 작동하며, 응답을 노트에 표시합니다. 앱은 무료 오픈소스이며 Apache-2.0 라이선스를 사용하고 계정 가입을 요구하지 않습니다.
Hacker News 반응
- @wakaru44 — 몇 년 전에는 비슷한 걸 하려고 Bash를 포함한 여러 백엔드를 붙인 Jupyter 노트북을 썼습니다.
- @dancablam — Jupyter는 훌륭합니다. 기억하기로는 Bash 커널이 실제 터미널 세션이 아니라서
sudo프롬프트나top같은 도구가 제대로 작동하지 않을 때가 있습니다. 저도.ipynb보다 마크다운을 선호합니다. - @bpshaver — 지적한 내용은 모두 맞지만 README 첫머리의 “코드를 실행하는 노트북”이라는 문구는 다시 생각해보면 좋겠습니다. 저도 마크다운을 더 좋아하고 몇 년째 노트북을 정기적으로 쓰지 않았지만, 그 문구를 읽고는 ‘Jupyter를 들어본 적 없나?’라고 생각했습니다. 이걸 노트북이라고 부르지 않는 편이 좋겠습니다. 그 말은 보통 여기서 말하는 것과 조금 다른 도구를 떠올리게 합니다.
- @dancablam — 좋은 의견입니다. “실행 가능한 마크다운 노트”가 더 나을 수도 있겠습니다.
- @dancablam — Jupyter는 훌륭합니다. 기억하기로는 Bash 커널이 실제 터미널 세션이 아니라서
- @rvdca — Org-mode 같은 도구와 비교하면 어떤가요?
- @dancablam — 좋은 질문입니다. Ledge는 이미 Emacs를 쓰지 않는 사람도 사용할 수 있고, Org 문법 대신 마크다운을 씁니다. 셸은 기본적으로 대화형이며 모바일 앱에서도 셸과 코드를 실행할 수 있습니다.
- @tetraodonpuffer — 셸 자동완성이나 별칭, 함수와 명령 생성 기능을 연동할 계획이 있나요? 저는 Ctrl-R과 fzf로 히스토리를 찾거나 Tab으로 Pod 이름을 자동완성하는 데 익숙해서,
kubectl명령을 처음부터 다 입력하진 않을 것 같습니다.- @dancablam — 터미널 패널에서는 Ctrl-R, fzf, Tab 자동완성이 작동합니다. 편집기 안의 자동완성은 아직 없지만 좋은 제안이라 살펴보겠습니다.
- @theCodeStig — 10년 넘게 Emacs를 써온 사용자로서 이 프로젝트가 정말 좋습니다. 팀 환경에서 Org Babel을 쓰기 어렵게 만들던 가장 큰 불만을 해결해줍니다. 익숙한 UI와 흔한 파일 형식은 큰 차이를 만듭니다.
- @dancablam — 고맙습니다. 프로젝트를 계속 발전시킬 힘이 생기네요.
- @junehwi — Org Babel, Jupyter, Atuin Desktop 등이 비슷한 아이디어를 다뤘지만 대중적인 작업 방식이 되지는 못했습니다. 오래 써본 분들은 무엇이 걸림돌이었나요? 사용성이나 접근성 문제였나요, 아니면 문서와 실제 작업을 분리하고 싶어 해서였나요?
- @ellieh — 안녕하세요, Atuin Desktop 작업에 많이 참여했습니다. 순서와 상관없이 문제를 몇 가지 꼽자면, 실행 가능한 런북을 작성하기 어렵고 대부분의 사람은 문서화조차 거의 하지 않습니다. 시스템마다 런북을 최신 상태로 유지하기 어렵고 오류가 생기기 쉽습니다. 또 에이전트가 이제 이런 도구가 해결하려는 여러 작업을 꽤 잘 처리하고, 문서가 오래돼 생기는 문제도 우회합니다. 이런 도구는 개인 노트로는 훌륭하지만 규모를 키우기 어렵습니다.
- @dancablam — 맥락을 나눠주셔서 감사합니다. Ledge는 작성 작업처럼 느껴지지 않아야 한다고 생각합니다. 저도 명령이 잔뜩 들어간 마크다운 문서를 이미 갖고 있어서 실행 가능하게 만드는 것이 자연스러운 다음 단계였습니다. 문서를 최신 상태로 유지하기 어렵다는 점에는 동의합니다. 내장 에이전트가 문서 갱신을 도와주길 바랍니다. 팀 노트북은 여전히 과제입니다. SSH 접근 권한이 있는 사람들이 함께 쓸 수는 있지만 충분하지 않을 수도 있습니다.
- @Gabrys1 — 좋은 아이디어네요. 한동안 AI를 언급하지 않는 프로젝트라 반가웠는데, 갑자기 “에이전트가 작업하도록 만들어졌습니다”라는 문구가 나오네요.
- @dancablam — 참고로 Ledge에는 AI가 내장되어 있지 않습니다. 원하는 사용자가 직접 AI를 연결하는 방식입니다.
- @20after4 — 흥미롭네요. 저는 오래전부터 마크다운에서 코드를 실행하는 방식에 관심이 있었습니다. 크누스의 좋은 아이디어 가운데 하나인 문학적 프로그래밍의 한 형태라고 생각합니다. 비슷한 프로젝트도 여럿 있었지만 제가 완벽하다고 생각할 만한 도구는 아직 없었습니다. 저는
xc를 오래 써왔고 제 용도에는 꽤 잘 맞습니다. Go로 만들어 단일 바이너리로 배포하고 복잡한 런타임 의존성이 없다는 점이 좋습니다. 내장 의존성 시스템으로 코드 블록 간 순서를 지정하고 의존 체인의 각 블록이 한 번만 실행되도록 할 수도 있습니다. 저는 설정 파일과 배포 스크립트를 README에 넣어 집의 라우터, 방화벽 규칙, DHCP, DNS, Git 저장소, 컨테이너를 관리합니다. - @mfld — 연구자로 일할 때 Org Babel을 많이 썼습니다. 데이터 정리와 그래프 코드, 설명을 한 문서에 담고, 무엇을 했는지 수식으로 적기도 했습니다. 그 문서를 pdflatex로 PDF로 내보내 공동 연구자에게 보내곤 했습니다. Ledge도 이런 방향을 고려해볼 수 있겠습니다.
원문: Ledge.sh / 번역·요약: Trawling