원문 저장소: sinelaw/fresh · 고정 커밋:
b95bd6810c2877a5b34aff4b2160d630466af30d(master, 2026-08-29) · 수집일: 2026-08-30
핵심 요지
- Fresh는 “제로 설정”을 내세우는 Rust 단일 바이너리 터미널 텍스트 에디터이자 IDE다.[1]
- VS Code/Sublime Text식 직관적 UX(표준 키바인딩·마우스·커맨드 팔레트)와 LSP·Git 리뷰·SSH 리모트·multi-GB 파일 편집 같은 IDE급 기능을 터미널에서 제공한다.[2]
- 차별점은 Orchestrator — git worktree당 워크스페이스를 만들고
claude/codex/opencode/aider코딩 에이전트를 각각 띄워 도크에서 전환하는 멀티태스킹 표면이다.[2][17] - 라이선스는 GPL-2.0이며, 2026-08-30 기준 ★8,577 / fork 318 / open issues 309를 기록했다.[19]
재현 가능한 조사 범위
- 대상 저장소: https://github.com/sinelaw/fresh (description: “Terminal based IDE & text editor: easy, powerful and fast”)[19]
- 고정 커밋:
b95bd6810c2877a5b34aff4b2160d630466af30d—git ls-remote origin refs/heads/master와 일치[1] - 고정 시점: 2026-08-29 23:04:44 (+03:00), 커밋 subject “Extract a fresh-i18n crate and drop the rust-i18n dependency (#3102)“[1]
- 최신 공개 릴리스: v0.4.10 (“fresh-editor 0.4.10”), 2026-08-20 공개 — 워크스페이스 버전(Cargo.toml 0.4.10)과 일치[3][18]
- 저장소 메타: 생성 2024-12-24, default branch master, tracked files 2080, Rust
.rs1171[1][19] - raw capture:
raw/articles/2026-08-30-github-sinelaw-fresh.md(선별 23개 파일, pinned-manifest, body SHA-2561b4d0c76b4208341f7c09fc1470ddfa905583da04c5a591be04e58cee99fcc46)[1]
사용자 표면 (README 기준)
- 제로 설정 + 표준 키바인딩(Ctrl+S/Z/F)·풀 마우스 지원·메뉴·커맨드 팔레트로 모달 에디터 학습 부담 없음[2]
- 파일 탐색기·탭·auto-revert·git file finder, undo/redo·multi-cursor·block selection·smart indent, incremental search·query replace·git grep[2]
- split panes·line numbers·line wrap·markdown preview, LSP(goto definition/references/hover/code actions/rename/diagnostics/autocompletion)[2]
- 커맨드 팔레트·메뉴 바·키보드 매크로·git log·diagnostics 패널[2]
- 테마 브라우저 + 풀 settings UI + 인터랙티브 키바인딩 에디터, 다국어 UI(한국어 포함)[2]
내부 구조와 데이터 흐름
- 워크스페이스는 12개 크레이트의 Cargo workspace이며
fresh-editor(바이너리fresh)가 진입점,fresh-core/fresh-ui/fresh-plugin-runtime/fresh-parser-js/fresh-languages/fresh-gui/fresh-winterm등이 구성요소다.[3][4][22] - Rust edition 2021,
rust-toolchain.toml은1.95(rustfmt+clippy)를 고정한다.[20] fresh-editor기본 feature는plugins,runtime,embed-plugins,tree-sitter,http,self-update이며, tree-sitter로 JS/TS/JSONC/Templ/Go 정밀 하이라이팅, 그 외 언어는 syntect 정규식 계층으로 처리한다.[4]- default feature의
embed-plugins는 플러그인·테마를 바이너리에#[embed]/build.rs로 내장해 단일 self-contained 실행 파일을 만든다(노드 모듈 불필요).[4][16] release.yml은 태그v[0-9]+.[0-9]+.[0-9]+*푸시 시 Linux/macOS/Windows(x86_64+aarch64) 바이너리를cargo build --release --target <T>로 크로스 빌드·아카이브하고, macOS는 시스템 라이브러리만 링크되는지 검증한다.[16]
Plugin·runtime 설계
- TypeScript 플러그인은 oxc로 트랜스파일 후 QuickJS(rquickjs) VM에서 샌드박스 실행된다.[5][13][23]
- 플러그인 API 노출 면(
ts_export.rs의JsEditorApi)에는readFile,writeFile,readDir,spawnHostProcess,httpFetch,setAuthority등이 포함된다 — 이는 QuickJS가 호스트 프로세스 내에서 파일·프로세스·네트워크 권한을 갖는다는 뜻이므로, “샌드박스”는 메모리/타입 격리 수준이지 capability sandbox는 아니다.[6] fresh-parser-js는fresh:plugin/<name>import에서 플러그인 의존성을 추출하고 위상정렬(topological sort)로 로드 순서를 정하고, 순환 의존 시 해당 플러그인을 로드하지 않는다.[13]PluginManager는pluginsfeature on/off에 따라 런타임 스레드를 spawn하거나 no-op으로 동작하며, per-window authority registry와 local 고정 filesystem으로 경로를 라우팅한다.[7]
리모트·에이전트·authority 설계
services/remote는user@host[:port](선택ssh://) 파싱 후ssh자식 프로세스를 띄우고, 파이프된 python agent를 stdin으로 부트스트랩해 비대화형 캐리어로 원격 워크스페이스를 구성한다(BatchMode,/dev/tty분리, kill_on_drop).[8][9][12]- Orchestrator의 agent-resume는
claude --session-id <id>→ 재시작 시claude --resume <id>(또는--continue) argv를 보존해 대화를 이어받는다;core/api.rs에 명세가 있다.[17] services/authority는 Docker(docker_spawner)와 Kubernetes(kube_spawner) spawner를 제공해 컨테이너/클러스터 내 워크스페이스를 붙일 수 있다.[10][11]
설치·셀프 업데이트·CI
scripts/install.sh는curl ... | sh진입점으로, 각 릴리스 에셋 옆.sha256sidecar를 받아 다운로드를 검증하고 불일치 시 설치를 거부한다(fail-closed).[14]fresh --cmd update는 다음 릴리스를 받아 게시된 checksum과 대조 후 바이너리를 제자리 교체한다; README는 “GitHub release attestation” 대조도 언급하나install.sh/release 워크플로 코드에서 cosign/SLSA/gh attestation참조는 발견되지 않았다(.sha256검증만 코드 확인).[2][14][21]ci.yml은 fmt/clippy(errors만 실패, warnings 허용)/doc/schema/--no-default-features --features runtimecheck/installer shellcheck/Ubuntu·macOS·Windowscargo nextestmatrix를 돈다.[15]- npm 배포는
package.json(@fresh-editor/fresh-editor)로 감싸며, crates.io publish 워크플로도 존재한다.[24][3]
보안 경계와 도입 주의점
- QuickJS 플러그인은 호스트 프로세스 권한(파일 읽기/쓰기, 호스트 프로세스 spawn, HTTP fetch)을 가지므로, 신뢰하지 않는 플러그인은 편집기와 동등한 권한의 trusted code로 취급해야 한다.[6]
- SSH 리모트는
ssh를 통째로 spawn하고 에이전트 바이트를 stdin으로 주입하므로, 로컬 ssh config/agent/키 권한 하에 원격 머신에서 명령을 실행한다 — 원격 워크스페이스는 ssh trust 경계와 같다.[8] - GPL-2.0 라이선스이므로, Fresh를 수정·재배포하거나 binary를 제품에 묶을 경우 소스 제공 의무가 따른다.[3][19]
빌드·실행 검증 (호스트 상태)
- 호스트에 Rust toolchain이 없어 본 조사에서는
cargo build/cargo test를 실행하지 않았다(정적 소스 검사만). 빌드 성공/테스트 통과는 주장하지 않는다. - 별도 격리 Rust 1.95 toolchain으로
cargo build --release시도를 백그라운드 실행 중이며, 완료 시 로그(/tmp/fresh-cargo-build.log)와 함께 결과를 갱신한다.
관련 문서
- 기존 제품 페이지 요약 2026-08-23-getfresh-dev-fresh (출처는
https://getfresh.dev/, 본 저장소 페이지와 별개) - 터미널 개발 도구 맥락 moc-dev-tools
- AI 코딩/에이전트 오케스트레이션 맥락 moc-ai-coding
Sources
[1] https://github.com/sinelaw/fresh — sinelaw/fresh repository (master HEAD pinned) [2] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/README.md — fresh README.md (pinned) [3] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/Cargo.toml — workspace Cargo.toml (version/license) [4] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-editor/Cargo.toml — fresh-editor Cargo.toml (features/bin) [5] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-plugin-runtime/src/backend/quickjs_backend.rs — QuickJS TypeScript plugin runtime backend [6] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-plugin-runtime/src/ts_export.rs — Plugin API surface (readFile/writeFile/spawnHostProcess/httpFetch) [7] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-editor/src/services/plugins/manager.rs — Unified Plugin Manager [8] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-editor/src/services/remote/connection.rs — SSH remote connection management [9] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-editor/src/services/remote/mod.rs — Remote workspaces module [10] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-editor/src/services/authority/docker_spawner.rs — Docker container authority spawner [11] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-editor/src/services/authority/kube_spawner.rs — Kubernetes authority spawner [12] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-editor/src/services/remote/protocol.rs — Remote agent protocol [13] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-parser-js/src/lib.rs — TypeScript transpile + plugin dependency topo sort [14] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/scripts/install.sh — install.sh (checksum-verified installer) [15] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/.github/workflows/ci.yml — CI workflow [16] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/.github/workflows/release.yml — Release workflow (cargo build per platform) [17] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-core/src/api.rs — Core plugin/agent API (resume argv) [18] https://github.com/sinelaw/fresh/releases/latest — Latest GitHub release v0.4.10 [19] https://api.github.com/repos/sinelaw/fresh — GitHub repo metadata (stars/forks/license/created) [20] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/rust-toolchain.toml — rust-toolchain.toml (Rust 1.95) [21] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-update/src/registry_checkout.rs — self-update registry checkout detection [22] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-core/Cargo.toml — fresh-core Cargo.toml [23] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/crates/fresh-plugin-runtime/Cargo.toml — fresh-plugin-runtime Cargo.toml [24] https://github.com/sinelaw/fresh/raw/b95bd6810c2877a5b34aff4b2160d630466af30d/package.json — package.json (npm distribution)