https://github.com/pyanchor/pyanchor
Agent-agnostic AI live-edit sidecar for Next.js. Anchor edits straight into your running app.
https://github.com/pyanchor/pyanchor
agent ai claude-code developer-tools express live-edit nextjs openclaw overlay self-hosted shadow-dom sidecar typescript
Last synced: about 2 months ago
JSON representation
Agent-agnostic AI live-edit sidecar for Next.js. Anchor edits straight into your running app.
- Host: GitHub
- URL: https://github.com/pyanchor/pyanchor
- Owner: pyanchor
- License: mit
- Created: 2026-04-18T15:26:32.000Z (2 months ago)
- Default Branch: main
- Last Pushed: 2026-04-24T13:40:08.000Z (about 2 months ago)
- Last Synced: 2026-04-24T14:39:08.918Z (about 2 months ago)
- Topics: agent, ai, claude-code, developer-tools, express, live-edit, nextjs, openclaw, overlay, self-hosted, shadow-dom, sidecar, typescript
- Language: TypeScript
- Homepage:
- Size: 2.62 MB
- Stars: 4
- Watchers: 0
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README-ko.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Audit: audit-codex-static.md
- Security: .github/SECURITY.md
- Roadmap: docs/roadmap.md
Awesome Lists containing this project
README
# Pyanchor π¦
**μΉ μ±μ© agent-agnostic AI λΌμ΄λΈ νΈμ§ μ¬μ΄λμΉ΄.**
*μ€ν μ€μΈ μ±μ μ§μ νΈμ§μ anchor β Next.js, Vite, λλ μ§μ λ§λ μ€ν.*
[](https://www.npmjs.com/package/pyanchor)
[](https://www.npmjs.com/package/pyanchor)
[](./LICENSE)
[**English**](./README.md) Β· [**λ¬Έμ**](#-λ¬Έμ) Β· [**λΉ λ₯Έ μμ**](#-λΉ λ₯Έ-μμ) Β· [**μ§μ agent**](#μ§μ-agent) Β· [**보μ**](#-보μ)
---
> Pyanchorλ μ€ν μ€μΈ μΉ μ±(Next.js / Vite / Astro / λλ install + build
> λͺ
λ Ήμ΄ μλ μ΄λ€ μ€ν)μ λΆμ΄λ μμ Express μ¬μ΄λμΉ΄μ
λλ€.
> ν μ€μ§λ¦¬ `` νκ·Έκ° νμ΄μ§ μμ overlayλ₯Ό μ£Όμ
(Shadow DOM, μ€νμΌ
> μΆ©λ μμ)νκ³ , μ¬μ©μλ UI elementλ₯Ό κ°λ¦¬ν¨ λ€ μμ°μ΄λ‘ λ³κ²½μ μ€λͺ
νλ©΄,
> AI μ½λ© agentκ° νΈμ§ β build β νλ‘ νΈμλ μ¬μμ λλ PR μμ±κΉμ§ β λꡬλ
> λΈλΌμ°μ λ₯Ό λ λμ§ μκ³ λλ©λλ€.
**self-host + prod-attached** μν¬νλ‘μ°μ©. SaaSλ, IDE νλ¬κ·ΈμΈλ μλ.
## λꡬλ₯Ό μνκ°?
μΈ κ°μ§ κ²ΉμΉλ use case. pyanchorκ° μ
λ€ λ€λ£¨λ μ΄μ λ **νμ΄μ§ μ체κ°
μλν°κ° λλ€**λ wedge λλ¬Έ β IDE νμ μμ.
- **μκΈ° deployλ₯Ό μ§μ dogfoodνλ μλ‘ dev.** "λ³΄κ³ β ν΄λ¦ β
ship" κ°μ₯ λΉ λ₯Έ 루ν. `apply` λͺ¨λλ λΌμ΄λΈ μ±μ μ§μ rsync.
- **"μ΄κ±° μ’ λ°κΏμ£ΌμΈμ" μ½μΌν°μ μ§μΉ νλ‘ νΈμλ dev.** μμ²μμκ²
token νλ μ₯μ΄μ£Όκ³ , νμ΄μ§ κ°λ¦¬ν€κ² νκ³ , μ
ν μλΉμ€μν€μΈμ.
`PYANCHOR_OUTPUT_MODE=pr` μ€μ νλ©΄ λͺ¨λ νΈμ§μ΄ PRλ‘ β νμ cadenceλ‘
reviewλ§ β κΉμ§ prod μ°κΈ° μμ.
- **λμμ΄λ, PM, λ°±μλ dev** β νλ‘ νΈμλ ν μ 건λλ¦¬κ³ μμ UI
λ³κ²½λ§ μ§μ νκ³ μΆμ μ¬λλ€. νμ΄μ§ μ΄κ³ , floating λ²νΌ ν΄λ¦,
"μ΄ λ²νΌ 보λΌμμΌλ‘ + λ‘λ© μ€νΌλ μΆκ°" μ
λ ₯ β 1λΆ μμ PR.
λ§μ§λ§μ΄ μ§μ§ pyanchorλ₯Ό λ§λ μ΄μ . *"about νμ΄μ§ μΉ΄νΌ μ’ λ°κΏμ€"*
Slack pingμ μ§μΉ authorκ° λ§λ€μμ. μ΄μ μμ²μκ° μ§μ νκ³ , νλ‘ νΈμλλ
PR reviewλ§.
## Cursor / v0 / Lovable λμ μ μ΄κ±Έ?
| | μ΄λμ λμ | 무μμ νΈμ§ | λκ° νΈμ§ν μ μλ |
| ------------ | --------------------- | --------------------- | -------------------------------------------- |
| Cursor | μλν° | μν¬μ€νμ΄μ€μ νμΌ | IDEλ₯Ό μΌ dev |
| v0 / Lovable | λ²€λ ν΄λΌμ°λ | μλ‘ λ§λλ μ± | λ²€λ κ³μ μμ μ |
| **Pyanchor** | μ§κΈ λ³΄κ³ μλ νμ΄μ§ | μ΄λ―Έ shipν μ± | **token + (μ ν) PR reviewλ₯Ό κ°μ§ λꡬλ** |
μ€ν
μ΄μ§μ λΌμ΄λΈ λ‘κ·ΈμΈ νμ΄μ§λ₯Ό κ°λ¦¬ν€λ©° *"λ€ν¬ λͺ¨λλ‘ λ°κΏ"*λΌκ³
νκ³ μΆμλ°, μ½λλ μ λ μΈνλΌ λ°μΌλ‘ λκ°λ©΄ μ λκ³ , Cursor seat κ°μ§
μ¬λλ§ μΈ μ μλ κ² μλμ΄μΌ νλ€λ©΄ β μ΄κ² λ§μ΅λλ€.
## λμ μ리
```
βββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ
β λΉμ μ μΉ μ± β β Pyanchor μ¬μ΄λμΉ΄ β
β (Next.js / Vite / β β (port 3010, localhost) β
β Astro / μ§μ μ€ν) β β β
β β β Express μλ² β
β layout/index μ£Όμ
: β β /_pyanchor/bootstrap.jsβ
β <script β ββ> β /_pyanchor/overlay.js β
β src="/_pyanchor/ β β /_pyanchor/api/edit β
β bootstrap.js" β β /api/admin/* β
β defer /> β β /healthz + /readyz β
β β β β
β Shadow DOM overlay β β Workspace + Worker β
β β ν΄λ¦ β ν둬ννΈ β <ββ β AgentRunner adapter β
β β β (codex/claude/...) β
βββββββββββββββββββββββββββ β build + apply / PR β
ββββββββββββββββββββββββββββ
```
## π λΉ λ₯Έ μμ
```bash
# 1. μ€μΉ (dev dep β pyanchorλ dev-time μ¬μ΄λμΉ΄, prod λ²λ€ λ―Έν¬ν¨)
npm install --save-dev pyanchor
# 2. μΈν°λν°λΈ init β 7κ° promptλ₯Ό enterλ‘ λ€λ₯
npx pyanchor init
# 3. μ§λ¨ β μλμΌλ‘ cwd .env λ‘λ
npx pyanchor doctor
# 4. μ¬μ΄λμΉ΄ μμ
npx pyanchor
# 5. initμ΄ μλ €μ€ bootstrap script νκ·Έ + dev proxy 1μ€μ©
# layout.tsx (Next.js) / index.html (Vite) / Base.astro (Astro) λ±μ paste
# 6. μΌλ° dev λͺ
λ ΉμΌλ‘ μ± λμ°κΈ° (npm run dev / pnpm dev)
# λΈλΌμ°μ : μ°νλ¨ anchor μμ΄μ½ β ν΄λ¦ β ν둬ννΈ μ
λ ₯ β 30μ΄ μμ νΈμ§ μ μ©
```
5κ° νμ env (`pyanchor init`μ΄ μλ μμ±):
- `PYANCHOR_TOKEN` β bearer auth secret
- `PYANCHOR_AGENT` β `codex` / `claude-code` / `openclaw` / `aider` / `gemini`
- `PYANCHOR_APP_DIR` β λΉμ μ±μ root
- `PYANCHOR_WORKSPACE_DIR` β agentκ° νΈμ§νλ scratch λλ ν 리
- `PYANCHOR_RESTART_SCRIPT` β νΈμ§ ν νλ‘ νΈμλ reload λ°©λ²
λλ¨Έμ§ ~60κ° envλ λͺ¨λ sensible default μμ. `.env.example` μ°Έκ³ .
## μ§μ agent
5κ° λ°±μλ. `PYANCHOR_AGENT=<name>` ν μ€λ‘ swap.
| Agent | μ€μΉ | μΈμ¦ |
| ------------- | ---------------------------------------------------- | ----------------------------------- |
| `codex` | `npm i -g @openai/codex` | `codex login` (ChatGPT account λλ OpenAI API key) |
| `claude-code` | `npm i @anthropic-ai/claude-agent-sdk` | `ANTHROPIC_API_KEY` λλ Claude OAuth |
| `openclaw` | OpenClaw μ체 μ€μΉ (per-agent profiles) | OpenClaw OAuth |
| `aider` | `pip install aider-chat` | `OPENAI_API_KEY` λ± |
| `gemini` | `npm i -g @google/gemini-cli` | `GEMINI_API_KEY` λλ `gemini auth login` |
## μ§μ framework
5κ° first-class profile + override path. `PYANCHOR_FRAMEWORK=<name>`.
| Framework | install | build | μν¬μ€νμ΄μ€ μ μΈ |
| ----------- | ---------------------------------- | ------------------ | ----------------- |
| `nextjs` | `corepack yarn install --frozenβ¦` | `next build` | `.next` |
| `vite` | `npm install` | `npm run build` | `dist`, `.vite` |
| `astro` | `npm install` | `npx astro build` | `dist`, `.astro` |
| `sveltekit` | `npm install` | `npm run build` | `.svelte-kit`, `build`, `dist`, `.vite` |
| `remix` | `npm install` | `npm run build` | `build`, `.cache` |
| `nuxt` | `npm install` | `npx nuxt build` | `.nuxt`, `.output`, `dist` |
λ€λ₯Έ μ€νμ `PYANCHOR_INSTALL_COMMAND` + `PYANCHOR_BUILD_COMMAND` envλ‘
override.
## μΆλ ₯ λͺ¨λ
| λͺ¨λ | λμ |
| -------- | ----------------------------------------------------------------- |
| `apply` | workspace β app dir rsync + restart μ€ν¬λ¦½νΈ μ€ν (κΈ°λ³Έ) |
| `pr` | git push + `gh pr create` (μλ merge μ ν¨; μ¬λμ΄ review) |
| `dryrun` | buildλ§; rsyncλ PRλ μ ν¨ (agent νλ¦ κ²μ¦μ©) |
`PYANCHOR_OUTPUT_MODE=<mode>` λλ init promptμμ μ ν.
## 보μ
- **token = privilege**: `PYANCHOR_TOKEN`μ΄ μ μΌν μΈμ¦
- **9-layer μ κ·Ό μ μ΄** (`docs/ACCESS-CONTROL.md`): token β bind β
origin β trusted hosts β gate cookie β bootstrap fail-safe β
reverse proxy β systemd IPAddress β HMAC actor signing
- **non-loopback bindλ origin νμ©λͺ©λ‘ νμ** (v0.18.0+, fail-closed)
- **destructive path guard** (v0.33.0+): system dir (`/`, `/home`,
`/var`, ...) κ±°λΆ β typoλ‘ `rm -rf`λλ μ¬κ³ λ°©μ§
- **provenance attested**: λͺ¨λ npm tarballμ Sigstore + GitHub
Actionsλ‘ signed (`npm view pyanchor@latest --json | jq
'.dist.attestations'`)
μμΈν μν λͺ¨λΈ + μ±
μ μλ κ³΅κ° β [`.github/SECURITY.md`](./.github/SECURITY.md).
## π λ¬Έμ
- [`docs/TROUBLESHOOTING.md`](./docs/TROUBLESHOOTING.md) β μ¦μ β
μ§λ¨ λΉ λ₯Έ λ§€ν
- [`docs/PRODUCTION-DEPLOYMENT.md`](./docs/PRODUCTION-DEPLOYMENT.md)
β systemd / Docker / Coolify λ°°ν¬ λ μνΌ
- [`docs/ACCESS-CONTROL.md`](./docs/ACCESS-CONTROL.md) β 9-layer
μ κ·Ό μ μ΄ μμΈν
- [`docs/codex-setup.md`](./docs/codex-setup.md) β codex λ°±μλ
- [`docs/claude-code-setup.md`](./docs/claude-code-setup.md) β
claude-code λ°±μλ
- [`docs/openclaw-setup.md`](./docs/openclaw-setup.md) β openclaw
- [`docs/aider-setup.md`](./docs/aider-setup.md) β aider
- [`docs/gemini-setup.md`](./docs/gemini-setup.md) β gemini
- [`docs/integrate-with-vite.md`](./docs/integrate-with-vite.md) β
Vite ν΅ν© μμΈν
## λΌμ΄λΈ λ°λͺ¨
[`https://pyanchor.pyan.kr`](https://pyanchor.pyan.kr) β recipe 1
(systemd + nginx + magic-word gate cookie + μ μ React)λ‘ μ΄μ μ€.
gate μΏ ν€ λ°κΈ ν νμ΄μ§ element ν΄λ¦νλ©΄ codex λ°±μλλ‘ λΌμ΄λΈ νΈμ§
μ¬μ΄ν΄ λμ.
## λΌμ΄μ μ€
MIT. Β© PYAN.
## μλ¬Έ λ¬Έμ
μ 체 μλ¬Έ READMEλ [`README.md`](./README.md) β μ΄ νκ΅μ΄ READMEλ
ν΅μ¬ μΉμ
λ§ λ²μ.