neuron-explorer
Qwen3.5‑4B 전용 조향형 뉴런 탐색기, 모든 MLP 뉴런을 밀어 결과를 보관·탐색
pi 코딩 에이전트를 위한 웹 UI
Web UI for the pi coding agent
개발 도구TypeScript · JavaScriptGitHub @agegr직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Local browser UI for the pi coding agent. Pi Web uses the same local configuration and session files as pi, so you can browse and resume conversations, run agent turns, configure models and resources, and inspect project files from a browser.
Try the interactive demo → The real Pi Web UI runs entirely in your browser, with sample sessions, files and models. There is nothing to install; replies are pre-written and no model is called.
Pi Web requires Node.js 22.19.0 or newer. Check your version with node --version, then run:
npx @agegr/pi-web@latest
The CLI opens a browser after the server is ready. If it does not, open http://127.0.0.1:30141. Pi Web listens only on 127.0.0.1 by default.
If no model provider is configured yet, open the Models panel to sign in or add an API key.
To install the pi-web command globally:
npm install -g @agegr/pi-web@latest
pi-web
Commands:
pi-web version # print the installed version
pi-web status # list running servers
pi-web stop [--port N] # stop a running server
pi-web open [--port N] # open a running server in the browser
pi-web update [--check] # update a global npm install
To update, run pi-web stop, then pi-web update (or run the same install command again). To uninstall, run npm uninstall -g @agegr/pi-web.
For port and hostname, command-line options override the corresponding environment variables. Either --no-open or PI_WEB_NO_OPEN=1 disables automatic browser opening. Run pi-web --help (or -h) to print startup options and exit without starting the server. Unknown options exit with an error.
| Option or environment variable | Purpose | Default |
|---|---|---|
--help, -h | Print startup options and exit | — |
--port <port>, -p <port>, or PORT | Server port | 30141 |
--hostname <host>, -H <host>, or PI_WEB_HOSTNAME | Bind hostname | 127.0.0.1 |
--no-open or PI_WEB_NO_OPEN=1 | Do not open a browser automatically | Browser opens |
PI_WEB_APP_NAME | PWA manifest name and short_name; surrounding whitespace is trimmed, empty values use the default | Pi Web |
PI_WEB_SKIP_VERSION_CHECK=1 | Disable Pi Web update checks | Unset |
PI_WEB_ALLOWED_HOSTS | Additional exact proxy or custom hostnames, comma-separated | Unset |
PI_WEB_PASSWORD | Enable browser password login; API clients may use Basic Auth with username pi | Authentication disabled |
PI_WEB_IDLE_TIMEOUT_MS | Session idle timeout in milliseconds, up to 2147483647; 0 disables idle shutdown; invalid or out-of-range values use the default | 600000 (10 min) |
PI_WEB_SHUTDOWN_DEADLINE_MS | How long extensions get to handle session_shutdown before a closing session is disposed anyway, in milliseconds up to 2147483647; 0, invalid or out-of-range values use the default | 5000 (5 s) |
PI_CODEMODE_MAX_WORKERS | pi's limit on codemode scripts running at once, shared by every session and subagent in the server; pi's own default is 2, and pi-web sets 8 when the variable is unset or empty. Each script may use up to 256 MB | 8 |
Set PI_WEB_APP_NAME before starting the server (for example, PI_WEB_APP_NAME='Work Pi' pi-web). After changing it, restart the server to serve the new manifest; no rebuild is required. Updates to the name of an already installed PWA are managed by the browser and are not guaranteed to appear immediately. This does not change the page title or icons.
For example:
pi-web --help
pi-web -p 8080 -H 0.0.0.0 --no-open
Binding to a non-loopback address exposes an agent that can execute high-privilege actions. On a trusted LAN, require a long random password:
PI_WEB_PASSWORD='a-long-random-password' pi-web --hostname 0.0.0.0
Password authentication does not encrypt the connection. Do not expose Pi Web over plain HTTP to the internet; use HTTPS through a trusted reverse proxy or a trusted VPN. If a reverse proxy sends an external hostname, add that exact name to PI_WEB_ALLOWED_HOSTS. This allow-list does not change the address Pi Web binds to.
Server-side model and API requests honor the standard HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables.
On macOS or Linux:
HTTP_PROXY=http://127.0.0.1:7890 \
HTTPS_PROXY=http://127.0.0.1:7890 \
NO_PROXY=localhost,127.0.0.1 \
npx @agegr/pi-web@latest
On Windows PowerShell:
$env:HTTP_PROXY = "http://127.0.0.1:7890"
$env:HTTPS_PROXY = "http://127.0.0.1:7890"
$env:NO_PROXY = "localhost,127.0.0.1"
npx @agegr/pi-web@latest
~/.pi/agent by default, including session files under sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl. Set PI_CODING_AGENT_DIR to use another pi agent directory.Electron wrappers and other downstream integrations can provide a session-row
context menu without patching SessionSidebar. Listen for the cancelable
pi-web:session-row-contextmenu browser event and call preventDefault()
synchronously when the integration will handle it:
window.addEventListener("pi-web:session-row-contextmenu", (event) => {
event.preventDefault();
const { id, path, cwd, name, clientX, clientY, refresh } = event.detail;
void openSessionMenu({ id, path, cwd, name, clientX, clientY }).then((changed) => {
if (changed) refresh();
});
});
The detail object contains id, path, cwd, optional name, pointer
coordinates, and a refresh() callback for actions that change the session
list. If no listener cancels the extension event, Pi Web opens its built-in
session menu (pin, rename, fork, mark read or unread, archive, open in new
tab, delete) at the pointer instead of the browser's native context menu.
The row's ⋯ button always opens the built-in menu and does not dispatch the
event. Sessions not yet saved to disk get no built-in menu, so the native one
still appears for them. This hook is browser-side and independent of Pi agent
extensions.
Server-side Pi extensions with detached work can prevent automatic idle session eviction through the versioned global registry:
const liveness = globalThis[Symbol.for("@agegr/pi-web/session-liveness/v1")];
const release = liveness?.version === 1
? liveness.register({
name: "my-extension",
sessionId,
sessionFile: sessionFile || undefined,
isActive: () => detachedJobs.size > 0,
})
: () => {};
Register once per active extension session and call the returned idempotent
release function on session shutdown, replacement, or reload. isActive
must be synchronous, cheap, and scoped to the supplied exact session id or
file. Provider errors fail safe by preserving that session. This lease only
affects automatic idle eviction; explicit shutdown and Stop fallback cleanup
still take precedence.
npm install
npm run dev
The development server runs at http://127.0.0.1:30141. Run the common checks with:
npm test
node_modules/.bin/tsc --noEmit
npm run lint
Do not run next build or npm run build during normal development. It writes to .next/ and can interfere with the development server; leave builds for release work.
Before starting on a feature, read Contributing for what is in scope and the pull request checklist.
Contributor guides: Internationalization and Release process.
app/ Next.js UI and API routes
components/ React UI components
hooks/ Client state and interaction hooks
lib/ Session, agent, model, file, Git, and security logic
public/ Static assets and PWA files
bin/ npm CLI entrypoint and launch option parsing
docs/ Focused user and contributor guides
demo/ Static browser demo published to GitHub Pages (see demo/README.md)
See AGENTS.md for the architecture notes and detailed file map.