[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-2071":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":14,"stars7d":14,"stars30d":13,"stars90d":16,"forks30d":16,"starsTrendScore":17,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":20,"hasPages":20,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":16,"starSnapshotCount":16,"syncStatus":15,"lastSyncTime":28,"discoverSource":29},2071,"localterm","millionco\u002Flocalterm","millionco","A terminal in your browser","https:\u002F\u002Flocalterm.dev\u002F",null,"TypeScript",152,11,1,2,0,3,3.24,"MIT License",false,"main",[23,5,24],"browser","terminal","2026-06-12 02:00:36","# localterm\n\n[![version](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Flocalterm?style=flat&colorA=000000&colorB=000000)](https:\u002F\u002Fnpmjs.com\u002Fpackage\u002Flocalterm)\n[![downloads](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdt\u002Flocalterm.svg?style=flat&colorA=000000&colorB=000000)](https:\u002F\u002Fnpmjs.com\u002Fpackage\u002Flocalterm)\n\nYour terminal should just be a browser tab.\n\nRun `npx localterm@latest start` and every browser tab is one shell. Open a new tab to spawn another. Close the tab to kill it. That's the whole product.\n\n![demo](https:\u002F\u002Fwww.localterm.dev\u002Fdemo.png)\n\n## Install\n\nRun this command anywhere:\n\n```bash\nnpx localterm@latest start\n```\n\nThis boots a local daemon and opens [`http:\u002F\u002Flocalterm.localhost:3417`](http:\u002F\u002Flocalterm.localhost:3417) in your browser. (`*.localhost` is reserved by [RFC 6761](https:\u002F\u002Fdatatracker.ietf.org\u002Fdoc\u002Fhtml\u002Frfc6761) and resolves to `127.0.0.1` in every modern browser, so no `\u002Fetc\u002Fhosts` edit needed.)\n\nTo install globally:\n\n```bash\nnpm install -g localterm\nlocalterm start\n```\n\n## Usage\n\nThe mental model is **shell = browser tab**:\n\n- **New tab** → new shell\n- **Close tab** → shell dies immediately\n- **Reload tab** → fresh shell (the prior one is gone)\n\nNo session ids, no URL slugs, no reconnects. If you want a long-lived shell that survives reloads, run `tmux` _inside_ localterm.\n\n## CLI\n\n```bash\nlocalterm start [-p 3417] [-H 127.0.0.1] [--no-open]   # daemonizes by default\nlocalterm stop\nlocalterm status\nlocalterm restart\n```\n\nState lives in `~\u002F.localterm\u002F` (PID, port, server log at `~\u002F.localterm\u002Fserver.log`).\n\n## Security\n\n- Binds loopback hosts only: `127.0.0.1`, `localhost`, `*.localhost`, `::1`. Non-loopback values are rejected.\n- `\u002Fapi\u002F*` and `\u002Fws` enforce loopback `Host` and `Origin` headers to defeat DNS-rebinding attacks.\n- One PTY per WebSocket. Closing the tab kills the shell — no orphaned processes.\n\n## Resources & Contributing Back\n\nLooking to contribute back? Check out the [Contributing Guide](https:\u002F\u002Fgithub.com\u002Fmillionco\u002Flocalterm\u002Fblob\u002Fmain\u002FCONTRIBUTING.md) and [`AGENTS.md`](https:\u002F\u002Fgithub.com\u002Fmillionco\u002Flocalterm\u002Fblob\u002Fmain\u002FAGENTS.md) for code style.\n\nFind a bug? Head over to our [issue tracker](https:\u002F\u002Fgithub.com\u002Fmillionco\u002Flocalterm\u002Fissues) and we'll do our best to help. We love pull requests, too!\n\n[**→ Start contributing on GitHub**](https:\u002F\u002Fgithub.com\u002Fmillionco\u002Flocalterm\u002Fblob\u002Fmain\u002FCONTRIBUTING.md)\n\n### License\n\nlocalterm is MIT-licensed open-source software.\n","localterm 是一个可以在浏览器中运行的终端。它允许用户通过简单的命令启动本地服务，并在浏览器的新标签页中打开新的 shell 会话，每个标签页对应一个独立的 shell。关闭标签页时，相应的 shell 会立即终止。该项目采用 TypeScript 编写，确保了代码的类型安全性和可维护性。localterm 适用于需要快速访问命令行工具，但又希望利用现代浏览器多标签特性的开发者或系统管理员。由于其设计简洁且安全性良好（仅绑定到回环地址），适合在开发、测试及个人项目管理等场景下使用。","2026-06-11 02:47:54","CREATED_QUERY"]