{"id":50985897,"url":"https://github.com/Cznorth/winkterm","last_synced_at":"2026-07-07T16:00:40.171Z","repository":{"id":355215806,"uuid":"1208954328","full_name":"Cznorth/winkterm","owner":"Cznorth","description":"AI that shares your terminal session. Open-source AI terminal where the AI types commands directly into your shell, not just suggests them. SSH, Docker, BYO LLM.","archived":false,"fork":false,"pushed_at":"2026-07-02T03:12:21.000Z","size":5073,"stargazers_count":17,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-07-02T05:10:44.485Z","etag":null,"topics":["ai-agent","ai-terminal","coding-assistant","devops","docker","fastapi","langgraph","llm","nextjs","open-source","pty","python","selfhosted","ssh","ssh-client","terminal","terminal-emulator","web-terminal","xtermjs"],"latest_commit_sha":null,"homepage":"https://cznorth.github.io/winkterm/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Cznorth.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"Cznorth","custom":["https://github.com/sponsors/Cznorth"]}},"created_at":"2026-04-13T00:29:26.000Z","updated_at":"2026-07-02T03:12:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Cznorth/winkterm","commit_stats":null,"previous_names":["cznorth/winkterm"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/Cznorth/winkterm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cznorth%2Fwinkterm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cznorth%2Fwinkterm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cznorth%2Fwinkterm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cznorth%2Fwinkterm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Cznorth","download_url":"https://codeload.github.com/Cznorth/winkterm/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cznorth%2Fwinkterm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35234127,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","ai-terminal","coding-assistant","devops","docker","fastapi","langgraph","llm","nextjs","open-source","pty","python","selfhosted","ssh","ssh-client","terminal","terminal-emulator","web-terminal","xtermjs"],"created_at":"2026-06-19T19:00:19.262Z","updated_at":"2026-07-07T16:00:40.165Z","avatar_url":"https://github.com/Cznorth.png","language":"Python","funding_links":["https://github.com/sponsors/Cznorth"],"categories":["Applications"],"sub_categories":["Tools"],"readme":"\u003cdiv align=\"center\"\u003e\n\n[中文版本](README.zh-CN.md)\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.svg\" alt=\"WinkTerm Logo\" width=\"120\"/\u003e\n  \u003ch1\u003eWinkTerm\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eAI that shares your terminal session.\u003c/strong\u003e\u003c/p\u003e\n  \u003cp\u003eNot a chatbot that suggests commands. A collaborator that types alongside you in the same PTY.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![TypeScript](https://img.shields.io/badge/language-TypeScript%20%2F%20Python-blue)](https://github.com/Cznorth/winkterm)\n[![Docker](https://img.shields.io/badge/deploy-Docker-2496ED?logo=docker)](docker-compose.yml)\n[![GitHub Stars](https://img.shields.io/github/stars/Cznorth/winkterm?style=social)](https://github.com/Cznorth/winkterm)\n[![Star History](https://api.star-history.com/svg?repos=Cznorth/winkterm\u0026type=Date)](https://star-history.com/#Cznorth/winkterm\u0026Date)\n[![Visitors](https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fgithub.com%2FCznorth%2Fwinkterm\u0026label=Visitors\u0026countColor=%23263759)](https://github.com/Cznorth/winkterm)\n[![Twitter](https://img.shields.io/twitter/url?url=https%3A%2F%2Fgithub.com%2FCznorth%2Fwinkterm)](https://twitter.com/intent/tweet?text=WinkTerm%20-%20AI%20that%20shares%20your%20terminal%20session\u0026url=https://github.com/Cznorth/winkterm)\n[![Promo Video](https://img.shields.io/badge/Promo-Video-ff0000?logo=youtube)](assets/promo.mp4)\n[![Dev.to](https://img.shields.io/badge/Read%20on-Dev.to-0A0A0A?logo=dev.to)](https://dev.to/cznorth/winkterm-ai-that-shares-your-terminal-session-not-just-command-suggestions-8p9)\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Cznorth/winkterm)\n\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#-demo\"\u003eDemo\u003c/a\u003e •\n  \u003ca href=\"#-features\"\u003eFeatures\u003c/a\u003e •\n  \u003ca href=\"#-codex-oauth-login\"\u003eCodex OAuth\u003c/a\u003e •\n  \u003ca href=\"#-agent-api-highlights\"\u003eAgent API\u003c/a\u003e •\n  \u003ca href=\"#-quick-start\"\u003eQuick Start\u003c/a\u003e •\n  \u003ca href=\"#-why-winkterm\"\u003eWhy WinkTerm?\u003c/a\u003e •\n  \u003ca href=\"#-architecture\"\u003eArchitecture\u003c/a\u003e •\n  \u003ca href=\"#-configuration\"\u003eConfiguration\u003c/a\u003e •\n  \u003ca href=\"#-development\"\u003eDevelopment\u003c/a\u003e •\n  \u003ca href=\"#-roadmap\"\u003eRoadmap\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## 🎬 Demo\n\n![WinkTerm Demo](assets/demo.gif)\n\n*GIF — real SSH session: a mistaken command (`ipconfig`), then `# what's wrong`; the AI answers in the same PTY and can pre-fill the fix.*\n\n[▶️ Watch Promo Video](assets/promo.mp4)\n\n*Promo — single-column terminal with multiple SSH tabs; Craft orchestrates checks across hosts (`list_ssh_connections`, `terminal_exec`, `ssh_run`).*\n\n```\n$ ipconfig\nCommand 'ipconfig' not found, did you mean: ...\n$ # what's wrong\n[WinkTerm] `ipconfig` is a Windows command — on Linux use `ip addr` (or `ifconfig`).\n$ ip addr█   ← AI wrote this. Press Enter to run. Backspace to edit. Ctrl+C to cancel.\n```\n\n**This is not a ChatGPT wrapper pasted into a terminal.**\nThe AI writes directly into your terminal's input line. You stay in control — press Enter to execute, edit freely, or cancel. It's like SSH-ing into a server with a knowledgeable partner who can reach across the screen and type.\n\n---\n\n## ✨ Features\n\n- **Shared PTY Session** — AI and user operate in the same terminal process. No copy-paste, no \"run this command\" without context.\n- **In-Terminal Chat** — Type `#` followed by your question, right where your shell prompt is. No need to alt-tab.\n- **Sidebar AI Panel** — Full conversational interface with multi-conversation tabs, AI-generated titles, and chat/craft mode switching.\n- **Persistent Chat History** — Conversations are saved to `~/.winkterm/chat_history.json` and restored on page load; survives WebSocket reconnects and backend restarts.\n- **Streaming Resume** — Refresh or reconnect mid-response without losing in-flight tokens; active streams are tracked server-side and replayed to new WebSocket clients.\n- **Streaming Queue \u0026 Suggestions** — Queue follow-up messages while the AI is responding (interrupt or drop queued items anytime), and get one-click follow-up suggestion chips after each answer.\n- **External Agent API** — An authenticated HTTP interface lets external agents drive your terminal, SSH, and file transfers via an installable skill (see Agent API highlights below).\n- **Agent Terminals in Your Tabs** — Agent-created sessions appear as normal terminal tabs (no separate monitor panel). `GET /api/sessions/stream` keeps the UI in sync; WebSocket disconnect no longer kills PTY sessions — refresh replays buffered output.\n- **Remote Access Auth** — Web access is protected by an access key; the local desktop client needs no authentication.\n- **SSH Remote Connections** — Connect to remote servers with built-in file transfer. Editing a connection without re-entering the password keeps the saved credential.\n- **Settings Export \u0026 Secret-safe Saves** — Export `config.json` from Settings (`GET /api/settings/export`). Blank password or API key fields on save do not wipe stored secrets.\n- **Reliable Terminals** — Debounced PTY sizing fixes truncated PowerShell prompts; agent multi-tab creation no longer leaves empty panes; WebSocket reconnect is silent (no disconnect banner that breaks PSReadLine).\n- **Internationalization** — Built-in English / Chinese UI, with language selection on first launch.\n- **Multi-Model Support** — Bring your own LLM (OpenAI, Anthropic, Ollama, any compatible endpoint), or sign in with **Codex OAuth** and use your ChatGPT / Codex subscription directly.\n- **Docker \u0026 Desktop** — Deploy instantly with `docker compose up` or package as a standalone desktop app (Windows/macOS).\n\n---\n\n## 🔐 Codex OAuth Login\n\nWinkTerm can talk to OpenAI **Codex** through an official OAuth flow — no API key, no third-party relay, no `codex exec` subprocess.\n\n**Why use it**\n\n| Advantage | What it means for you |\n|-----------|----------------------|\n| **ChatGPT / Codex subscription** | Use models like `gpt-5.5` with the account you already pay for — no separate OpenAI API billing. |\n| **Zero API config** | In **Settings → API format**, choose **Codex OAuth**, click login, pick a model. No `base_url` or `api_key` fields. |\n| **Official OAuth, local tokens** | Browser authorization; tokens land in `~/.codex/auth.json` on the machine running WinkTerm. |\n| **Native WebSocket transport** | Sidebar chat and the in-terminal `#` agent stream over Codex Responses — full tool calls (`list_terminals`, `ssh_run`, …), multi-turn history, no fallback to shelling out to the CLI. |\n| **Same human-in-the-loop UX** | Craft / chat / ask modes, streaming, queued follow-ups, and tool approval all work the same as with a BYO endpoint. |\n| **Desktop-friendly** | OAuth URL can be copied when the embedded WebView cannot open a browser tab automatically. |\n\n**Setup (30 seconds)**\n\n1. Open **Settings** → set **API format** to **Codex OAuth**.\n2. Click **Login with ChatGPT** (or copy the auth URL into your browser).\n3. Select a Codex model (e.g. `gpt-5.5`) and start chatting in the sidebar or with `#` in any terminal tab.\n\nYou can switch back to OpenAI / Anthropic / a custom base URL anytime — Codex OAuth is an option, not a lock-in.\n\n---\n\n## 🤖 Agent API Highlights\n\nWinkTerm's HTTP Agent API is designed for AI agents (Claude Code, Cursor, etc.) to drive the terminal remotely — not just an afterthought.\n\n### Endpoints\n\n| Endpoint | Purpose |\n|----------|---------|\n| `POST /api/agent/terminals/{id}/exec` | **Atomic execution**: returns stdout + real `exit_code` + current `cwd`. Sentinel marker auto-strips command echo and prompt. Supports `cwd` / `env` subshell injection (doesn't pollute persistent terminal state). |\n| `POST /api/agent/ssh/{conn_id}/run` | **One-shot SSH execution**: bundles create → exec → close into one call, saving 3 round-trips. |\n| `POST/GET/PUT/DELETE /api/agent/ssh/connections[/{id}]` | **SSH connection management**: full CRUD on the stored connection profiles, plus `POST /api/agent/ssh/import/electerm`. Update leaves masked/omitted secrets unchanged. |\n| `POST /api/agent/terminals/{id}/input` | **Named control keys**: `{\"keys\": [\"ctrl+c\"]}` instead of stuffing control chars into JSON. `data_b64` input bypasses multi-layer quote escape hell. |\n| `GET /api/agent/terminals/{id}/snapshot?pattern=...` | **Server-side grep**: regex-match within the 256KB rolling buffer. Save bandwidth. |\n| `GET /api/agent/terminals/{id}/stream` | **SSE live output**: killer feature for long-running commands / `tail -f`. Resume with `since` after disconnect. |\n| `GET /api/agent/events/stream` | **Operation event feed**: every agent action is pushed to a ring buffer (no persistence), broadcast via SSE. |\n| `GET /api/sessions` / `GET /api/sessions/stream` | **Session lifecycle**: list user-visible terminals; SSE pushes `session_created` / `session_closed` so the web UI tab bar stays in sync with agent activity. |\n| `GET /api/chat/conversations` | **Chat persistence**: list saved sidebar conversations (also written to `~/.winkterm/chat_history.json`). |\n| `GET /api/settings/export` | **Config backup**: download full `config.json` (localhost or valid `X-Access-Key`). |\n| `GET /api/agent/handshake` | **Zero-config onboarding**: localhost or web-auth'd clients get the token automatically. The agent doesn't need to ask the user every session. |\n\n### Key Design Choices\n\n- **Exit codes are first-class**: no need to grep output to detect failure — `exit_code` is in the response.\n- **30+ named keys**: `ctrl+c` / `up` / `tab` / `esc` / `f1` — no raw control chars in JSON.\n- **base64 input**: complex awk / jq / heredoc commands go through `command_b64`, sidestepping triple-escaping.\n- **Persistent cwd tracking**: the exec sentinel reports `$PWD` after every run; the monitoring panel displays the terminal's current directory.\n- **TTL auto-cleanup**: terminals default to 30-minute idle TTL, so forgotten terminals don't leak.\n- **wait reason field**: distinguishes `idle` / `timeout` / `no_output` so callers know what happened.\n\n### Installable Skill\n\n**Claude Code plugin (one-liner):**\n\n```bash\n/plugin marketplace add Cznorth/winkterm\n/plugin install winkterm-remote@winkterm\n```\n\n**Any agent (raw skill from a running backend):**\n\n```bash\ncurl -s http://\u003cyour-winkterm-host\u003e:8000/api/agent/skill.md \u003e SKILL.md\n```\n\nDrop SKILL.md into Claude Code / Cursor / any agent tool's skills directory and the AI immediately knows how to drive the API. The skill is versioned — agents check for updates each session.\n\n### Unified Session Pool\n\nInternal craft agents and the external HTTP API share the same terminal session pool and tool surface (`list` / `create` / `close` / `snapshot` / `input` / `exec` / `ssh_run`). Agent-created terminals are **user-visible** and open as regular tabs in the main UI. Subscribe to `/api/sessions/stream` for live tab sync, or `/api/agent/events/stream` for a color-coded operation audit log.\n\n### Case Study\n\n[📖 Case: AI agent locates and removes an XMR cryptojacker in 30 minutes via WinkTerm](docs/case-study-xmr-miner-cleanup.en.md)\n\nA real incident write-up: user said only \"the 107.173 server's load is high,\" and the AI agent completed discovery → investigation → kill chain reconstruction → hardening → abuse reporting end-to-end via the Agent API. The 9 new features in this release were reverse-engineered from the pain points hit during this exact case.\n\n---\n\n## 🔥 Why WinkTerm?\n\n| Feature | WinkTerm | Warp | Tabby | Claude Code |\n|---------|----------|------|-------|-------------|\n| Shared PTY (AI types in your terminal) | ✅ | ❌ | ❌ | ❌ |\n| Open source | ✅ | ✅ | ✅ | ❌ |\n| Self-hosted / BYO LLM | ✅ | ❌ | ❌ | ✅ |\n| Codex OAuth (ChatGPT login) | ✅ | ❌ | ❌ | ❌ |\n| Web UI | ✅ | ✅ | ✅ | ❌ (CLI only) |\n| SSH + file transfer | ✅ | ❌ | ✅ | ❌ |\n| Desktop app | ✅ | ✅ | ✅ | ❌ |\n\n**WinkTerm's core philosophy**: The terminal is where operations happen. AI should live *inside* it, not beside it. When the AI writes a command into your input line and you press Enter, you're not blindly trusting — you're reviewing, understanding, and choosing. That's collaborative ops.\n\n---\n\n## 🚀 Quick Start\n\n### Docker (easiest)\n\n```bash\ndocker run -p 3000:3000 -p 8000:8000 \\\n  -e ANTHROPIC_API_KEY=*** \\\n  ghcr.io/cznorth/winkterm:latest\n```\n\nOr with docker-compose:\n\n```bash\ngit clone https://github.com/Cznorth/winkterm.git\ncd winkterm\ncp .env.example .env\n# Edit .env with your API keys\ndocker compose up -d\n```\n\nThe compose file mounts a `winkterm-data` volume at `/root/.winkterm`, so config, chat history, and SSH credentials survive container rebuilds. The image also bundles the installable agent skill (no 404 on `skill.md` fetch).\n\nThen open **http://localhost:3000**\n\n### Desktop App\n\nDownload the latest release for your platform from the [Releases page](https://github.com/Cznorth/winkterm/releases).\n\n- **Windows**: `.exe` installer\n- **macOS**: `.app` bundle (Intel \u0026 Apple Silicon). The desktop build starts the embedded backend before opening the WebView and avoids baking dev-only `localhost:8000` into static assets.\n\n---\n\n## ⚙️ Configuration\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `ANTHROPIC_API_KEY` | Anthropic API key (required) | — |\n| `OPENAI_API_KEY` | OpenAI API key (alternative) | — |\n| `MODEL_NAME` | Model to use | `claude-sonnet-4-20250514` |\n| `OPENAI_BASE_URL` | Custom API endpoint | — |\n| `AGENT_RECURSION_LIMIT` | Agent recursion limit | `100` |\n| `PROMETHEUS_URL` | Prometheus endpoint | `http://localhost:9090` |\n| `LOKI_URL` | Loki endpoint | `http://localhost:3100` |\n| `DEBUG` | Enable debug mode | `false` |\n\n\u003e **Bring your own LLM**: WinkTerm uses the OpenAI-compatible protocol. Set `OPENAI_BASE_URL` to any provider (Ollama, vLLM, Groq, OpenRouter, etc.) and WinkTerm will use it.\n\n\u003e **Codex OAuth (UI)**: No env vars required — enable **Codex OAuth** in Settings and complete browser login. Status: `GET /api/codex/status`; start login: `POST /api/codex/oauth/start`.\n\n---\n\n## 🏗 Architecture\n\n```\nUser Keyboard Input\n    │\n    ▼\nFrontend Terminal (xterm.js)\n    │  WebSocket\n    ▼\nws_handler.py\n    │\n    ├── Normal input ──► pty_manager.write() ──► shell process\n    │\n    └── Lines starting with # ──► intercept ──► Agent (LangGraph)\n                                                    │\n                                                    ├── get_terminal_context()\n                                                    ├── terminal_input()\n                                                    └── write_command() ──► pty ──► terminal input line\n```\n\n**Key insight**: AI messages are written directly into the PTY output stream, so they appear seamlessly in your terminal. No separate UI chrome, no context switching.\n\n### Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| Backend | Python + FastAPI + LangGraph + LangChain |\n| Frontend | Next.js 14 + TypeScript + xterm.js |\n| Database-less | `~/.winkterm/config.json` + `chat_history.json` on disk |\n| Deployment | Docker Compose / PyInstaller desktop app |\n\n---\n\n## 🛠 Development\n\n### Prerequisites\n\n- Python 3.12+\n- Node.js 20+\n- Docker (optional)\n\n### Backend\n\n```bash\ncd backend\npython -m venv .venv\nsource .venv/bin/activate  # Windows: .venv\\Scripts\\activate\npip install -r requirements.txt\npython -m uvicorn backend.main:app --reload --port 8000\n```\n\n### Frontend\n\n```bash\ncd frontend\nnpm install\nnpm run dev\n```\n\nOpen http://localhost:3000\n\n### Frontend verification\n\nIn **Cursor**, use the built-in browser MCP against `http://localhost:3000` (click `.xterm-screen`, read `.xterm-rows` via CDP). Elsewhere, use `puppeteer-core` with system Chrome — see [CLAUDE.md](CLAUDE.md) for the full smoke checklist and agent HTTP curl recipes.\n\n### README media (maintainers)\n\nRequires local frontend/backend, system Chrome, and `ffmpeg`. Uses your `~/.winkterm/config.json` (theme, language, SSH connections).\n\n```bash\ncd scripts \u0026\u0026 npm install\nnode record-readme-normal.mjs   # → assets/demo.gif\nnode record-promo-normal.mjs    # → assets/promo.mp4\nnode capture-og-image.mjs       # → assets/og-image-social.png (from demo final frame)\n```\n\nSlow down an existing GIF without re-recording: `REBUILD_GIF_ONLY=1 GIF_FRAME_SEC=1.4 node record-readme-normal.mjs`\n\n### API Types (orval)\n\n```bash\n# With the backend running\ncd frontend\nnpm run gen:api\n```\n\n---\n\n## 🗺 Roadmap\n\n- [ ] Vim/Neovim integration (AI writes inside buffers)\n- [ ] Terminal recording \u0026 replay (as replays)\n- [ ] Multi-Agent orchestration (parallel ops)\n- [ ] Plugin system for custom tools\n- [ ] Native tmux integration\n- [ ] Kubernetes context awareness\n\n---\n\n## 🤝 Contributing\n\nWe welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n**Ideas for first PRs:**\n- Improve error messages and edge-case handling\n- Add more agent tools (kubectl, docker, git helpers)\n- Write tests (backend is undertested)\n- Improve the xterm.js theme/color scheme\n- Add language support for agent prompts\n\n---\n\n## 🔗 Friendly Links\n\n- [LinuxDo](https://linux.do) — a community of people who love technology\n\n---\n\n## 📄 License\n\n[MIT](LICENSE) © 2026 Cznorth\n\n---\n\n## 🌐 Translations\n\n- [English](README.md) (current)\n- [中文](README.zh-CN.md)\n\n---\n\n\u003cdiv align=\"center\"\u003e\n  \u003cp\u003eMade with ❤️ by \u003ca href=\"https://github.com/Cznorth\"\u003eCznorth\u003c/a\u003e\u003c/p\u003e\n  \u003cp\u003e\n    \u003ca href=\"https://github.com/Cznorth/winkterm/issues\"\u003eReport Bug\u003c/a\u003e •\n    \u003ca href=\"https://github.com/Cznorth/winkterm/discussions\"\u003eDiscussion\u003c/a\u003e •\n    \u003ca href=\"https://star-history.com/#Cznorth/winkterm\u0026Date\"\u003eStar History\u003c/a\u003e •\n    \u003ca href=\"https://twitter.com/intent/tweet?text=WinkTerm%20-%20AI%20that%20shares%20your%20terminal%20session\u0026url=https://github.com/Cznorth/winkterm\"\u003eShare on Twitter\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FCznorth%2Fwinkterm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FCznorth%2Fwinkterm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FCznorth%2Fwinkterm/lists"}