[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81519":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":17,"stars7d":15,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":34,"readmeContent":35,"aiSummary":36,"trendingCount":16,"starSnapshotCount":16,"syncStatus":37,"lastSyncTime":38,"discoverSource":39},81519,"tapflow","jo-duchan\u002Ftapflow","jo-duchan","Self-hosted iOS & Android simulator streaming for the whole team","https:\u002F\u002Fwww.tapflow.dev",null,"TypeScript",47,4,27,15,0,14,20,42,71.6,"MIT License",false,"main",true,[26,27,28,29,30,31,32,33],"android-emulator","appetize-alternative","browser-based","ios-simulator","mobile-testing","qa","remote-testing","self-hosted","2026-06-12 04:01:34","\u003Cdiv align=\"center\">\n  \u003Cimg src=\"docs\u002Fpublic\u002Flogo-hero.svg\" height=\"72\" alt=\"tapflow\" \u002F>\n\n  \u003Ch3>A self-hosted Appetize \u002F BrowserStack alternative for mobile QA teams\u003C\u002Fh3>\n\n  \u003Cp>\n    Run iOS simulators and Android emulators in any browser — no toolchain setup, no device management, no cloud uploads.\u003Cbr \u002F>\n    App data never leaves your network.\n  \u003C\u002Fp>\n\n  \u003Cp>\n    \u003Ca href=\"LICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-blue.svg\" alt=\"MIT License\" \u002F>\u003C\u002Fa>\n    \u003Ca href=\"https:\u002F\u002Fnodejs.org\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnode-%3E%3D20-brightgreen\" alt=\"Node.js ≥ 20\" \u002F>\u003C\u002Fa>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatform-macOS-lightgrey\" alt=\"macOS Agent\" \u002F>\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjo-duchan\u002Ftapflow\u002Fblob\u002Fmain\u002FCONTRIBUTING.md\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPRs-welcome-brightgreen.svg\" alt=\"PRs welcome\" \u002F>\u003C\u002Fa>\n    \u003Ca href=\"ROADMAP.md\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Froadmap-v0.x→v1.0-blueviolet\" alt=\"Roadmap\" \u002F>\u003C\u002Fa>\n  \u003C\u002Fp>\n\n  \u003Cp>\n    \u003Ca href=\"https:\u002F\u002Fwww.tapflow.dev\">📖 Docs\u003C\u002Fa>\n    &nbsp;·&nbsp;\n    \u003Ca href=\"https:\u002F\u002Fwww.tapflow.dev\u002Fguide\u002Fgetting-started\">🚀 Quick Start\u003C\u002Fa>\n    &nbsp;·&nbsp;\n    \u003Ca href=\"https:\u002F\u002Fwww.tapflow.dev\u002Fguide\u002Fintroduction\">🎥 Demo\u003C\u002Fa>\n  \u003C\u002Fp>\n\u003C\u002Fdiv>\n\n\u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F75652346-93cb-4261-9210-6a24b883d44a\" controls width=\"100%\">\u003C\u002Fvideo>\n\n> **v0.x**: tapflow is under active development. Breaking changes may appear in minor versions until v1.0.0. See [ROADMAP](.\u002FROADMAP.md) for the full plan.\n\n---\n\n## Why tapflow?\n\nIf you work on a mobile product, you've probably seen this.\n\nPhysical devices are never enough. Covering every OS version is even harder — iOS doesn't support downgrading, so maintaining a range of versions means managing a pool of locked devices, which is overhead nobody wants.\n\nBut the bigger friction is access. Simulators only run on a developer's Mac, behind complex developer toolchains. Anyone on the team who isn't a mobile developer has to ask one every single time they need to verify something:\n\n> **Server \u002F FE developer** — \"How do I install the sandbox build to check what was deployed?\"\n>\n> **Product manager** — \"I keep having to install and remove different versions just to compare behavior.\"\n>\n> **Designer** — \"I need to check the layout across screen sizes, but I don't have the right devices.\"\n\nCloud simulator services exist. But uploading internal app builds to an external service — and paying monthly fees for simulators already running on Macs you own — was never something we wanted to do.\n\nSo we built tapflow.\n\n| Solution | Problem |\n|----------|---------|\n| Appetize \u002F BrowserStack | Expensive — app data leaves your network |\n| Physical devices | Cost, loss, management overhead |\n| Xcode \u002F Android Studio | Every QA member needs their own Mac + full toolchain setup |\n| **tapflow** | Use the Mac you already own — data stays on-prem, whole team does QA from a browser |\n\n## Features\n\ntapflow focuses on:\n\n- **Zero setup for QA** — any browser, no toolchain. Designers, PMs, and server devs test without asking a mobile developer.\n- **Data on-premises** — app binaries and session recordings never leave your network.\n- **Your existing Mac** — no new hardware, no monthly cloud subscription.\n- **API-first** — REST endpoints and PATs built in, ready for CI\u002FCD and AI agent workflows.\n\nWhat's included:\n\n- **iOS & Android streaming** — ~30 fps, no additional app required on the device\n- **Touch, swipe & pinch** — real-time input forwarded to the simulator\n- **Deeplink** — jump directly to any screen from the QA toolbar, no manual navigation\n- **Keyboard shortcuts** — simulator toolbar actions without leaving the keyboard\n- **App Center** — upload `.app.zip` \u002F `.apk`, track builds by status (Backlog \u002F In Progress \u002F Done \u002F Rejected)\n- **Session recordings** — record and share QA sessions, retained 72 hours\n- **Screenshot REST endpoint** — `GET \u002Fapi\u002Fv1\u002Fsessions\u002F:sessionId\u002Fscreenshot` for CI and AI agents\n- **Mac resource monitoring** — CPU & RAM per agent, spot overloaded hosts before assigning sessions\n- **Team management** — invite links, roles (Admin \u002F Developer \u002F QA \u002F Viewer), Personal Access Tokens\n- **MCP Server** *(experimental)* — `@tapflowio\u002Fmcp-server` lets Claude Code and other LLM agents control simulators as native tools.\n\n## How it works\n\n```\nBrowser (your team)  ←─ WebSocket ─→  Relay Server  ←─ WebSocket (outbound) ─→  Mac Agent\n                                    (Linux \u002F Mac)                           (iOS · Android)\n```\n\n1. The **Mac Agent** connects *outbound* to the relay — no inbound firewall rules needed.\n2. Anyone on the team opens the **dashboard** in any browser and sees all available devices.\n3. Touch events are forwarded in real time; the screen streams back to the browser.\n4. The **relay** also serves the dashboard SPA on the same port — no separate web server needed.\n\n## Quick Start\n\n### 1. Install\n\n```sh\nnpm install -g tapflow\n# or: yarn global add tapflow  |  pnpm add -g tapflow\n```\n\n### 2. Start relay + agent\n\n```sh\ntapflow start\n# ✓ Relay started on http:\u002F\u002Flocalhost:4000\n# ✓ iOS Agent connected (3 simulators available)\n```\n\nThis starts both the relay and the agent on the same Mac (local mode).\n\n### 3. Create the first admin account\n\n```sh\ntapflow init\n# ? Admin email: admin@yourteam.com\n# ? Password: ********\n# ✓ Admin account created\n```\n\n### 4. Open the dashboard\n\nNavigate to `http:\u002F\u002Flocalhost:4000` and sign in with the account you just created.\n\n> **Having issues?** Run `tapflow doctor` to auto-diagnose Node.js, Xcode, `adb`, and other prerequisites.\n\n## Requirements\n\n| Component | Requirements |\n|-----------|-------------|\n| **Relay server** | Node.js ≥ 20, any OS (Linux\u002FmacOS), ~512 MB RAM |\n| **iOS Agent** | macOS, Xcode with iOS Simulator Runtime, Node.js ≥ 20 |\n| **Android Agent** | macOS, Android SDK (`adb` in `$PATH` or `$ANDROID_HOME` set), AVD with `google_apis\u002Farm64-v8a` (android-34), Node.js ≥ 20 |\n| **Browser (QA)** | Any modern browser — Chrome, Firefox, Safari, Edge |\n\n## Self-Hosting\n\n### Local (single Mac)\n\nRelay and agent on the same machine — ideal for a single developer or small team.\n\n```sh\ntapflow start\n```\n\n### Team (separate relay server)\n\nRun the relay on a Linux server or dedicated Mac. Each Mac with simulators runs the agent.\n\n**Relay server:**\n\n```sh\n# Recommended: PM2 for automatic restarts\nnpm install -g pm2 tapflow\nJWT_SECRET=$(openssl rand -hex 32) pm2 start tapflow --name relay -- relay start\npm2 save && pm2 startup\n```\n\n**Each Mac agent:**\n\n```sh\ntapflow agent start --relay wss:\u002F\u002Fyour-relay-url\n```\n\n> For nginx \u002F Caddy reverse proxy setup and external access, see [Self-Hosting the Relay](https:\u002F\u002Fwww.tapflow.dev\u002Fguide\u002Fself-hosting).\n\n## CLI Reference\n\n| Command | Description |\n|---------|-------------|\n| `tapflow start` | Start relay + agent together (local mode) |\n| `tapflow relay start` | Start relay only |\n| `tapflow agent start --relay \u003Curl>` | Start agent and connect to a relay |\n| `tapflow init` | Create the first admin account |\n| `tapflow doctor` | Diagnose environment (Node, Xcode, adb…) |\n| `tapflow devices` | List available simulators and emulators |\n| `tapflow boot \u003Cname\\|udid>` | Boot a simulator or emulator |\n| `tapflow status` | Show connected agents, devices, active sessions |\n| `tapflow reset` | Shut down all simulators and emulators |\n| `tapflow logs` | Show recent relay log entries |\n\nFull reference → [CLI docs](https:\u002F\u002Fwww.tapflow.dev\u002Freference\u002Fcli)\n\n## Documentation\n\n**[www.tapflow.dev](https:\u002F\u002Fwww.tapflow.dev)**\n\n**Getting Started**\n- [Introduction](https:\u002F\u002Fwww.tapflow.dev\u002Fguide\u002Fintroduction)\n- [Quick Start](https:\u002F\u002Fwww.tapflow.dev\u002Fguide\u002Fgetting-started)\n- [Requirements](https:\u002F\u002Fwww.tapflow.dev\u002Fguide\u002Frequirements)\n\n**Setup**\n- [Self-Hosting the Relay](https:\u002F\u002Fwww.tapflow.dev\u002Fguide\u002Fself-hosting)\n- [Agent Setup](https:\u002F\u002Fwww.tapflow.dev\u002Fguide\u002Fagent)\n- [Uploading Builds (CI\u002FCD)](https:\u002F\u002Fwww.tapflow.dev\u002Fguide\u002Fupload-builds)\n- [Scaling Mac Resources](https:\u002F\u002Fwww.tapflow.dev\u002Fguide\u002Fscaling)\n\n**Dashboard**\n- [First-time Setup](https:\u002F\u002Fwww.tapflow.dev\u002Fdashboard\u002Fsetup)\n- [Dashboard Overview](https:\u002F\u002Fwww.tapflow.dev\u002Fdashboard\u002Foverview)\n\n**AI Agent**\n- [MCP Server](https:\u002F\u002Fwww.tapflow.dev\u002Fguide\u002Fmcp-server) *(experimental)*\n\n**Reference**\n- [CLI Reference](https:\u002F\u002Fwww.tapflow.dev\u002Freference\u002Fcli)\n- [Configuration](https:\u002F\u002Fwww.tapflow.dev\u002Freference\u002Fconfiguration)\n- [REST API](https:\u002F\u002Fwww.tapflow.dev\u002Freference\u002Fapi)\n\n**[Troubleshooting](https:\u002F\u002Fwww.tapflow.dev\u002Fguide\u002Ftroubleshooting)**\n\n## Development\n\n**Requirements**: Node.js ≥ 20, pnpm ≥ 9\n\n```sh\ngit clone https:\u002F\u002Fgithub.com\u002Fjo-duchan\u002Ftapflow.git\ncd tapflow\npnpm install\npnpm dev\n```\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for branch strategy, commit conventions, and architecture overview.\n\n## License\n\n[MIT](LICENSE) — Copyright © 2025-present tapflow contributors\n\n> tapflow bundles [scrcpy-server](https:\u002F\u002Fgithub.com\u002FGenymobile\u002Fscrcpy) (Apache-2.0) for Android screen streaming. See [NOTICE](NOTICE) for full attribution.\n","tapflow 是一个自托管的移动设备模拟器流媒体平台，适用于iOS和Android系统的团队协作。项目使用TypeScript开发，允许团队成员通过浏览器直接运行iOS模拟器和Android模拟器，无需安装任何工具链或管理物理设备，同时确保应用数据不会离开内部网络。其主要特点包括支持跨平台访问、零配置启动以及高度的安全性。非常适合需要频繁进行移动端测试但又受限于硬件资源或安全考虑的QA团队使用，在保证效率的同时也降低了成本。",2,"2026-06-11 04:05:22","CREATED_QUERY"]