Codync
무료 오픈소스 1:1 대안, Grok Bot과 Muse 대신
Cloudflare 기반 오픈소스 AI 에이전트
An open-source AI agent on Cloudflare: generative UI, ClinePass, OpenCode Go, and ChatGPT models, a cloud VM per chat you can watch, skills, MCP servers, GitHub, and native iOS and Android apps.
개발 도구Kotlin · SwiftGitHub @nearbycoder온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A personal AI agent on Cloudflare: Pi Durable, generative UI, ClinePass or OpenCode Go models, and a cloud VM per chat you can watch live
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Dex is a personal agent harness. Each user gets an agent in a Cloudflare Durable Object running Pi Durable, thinking with models through ClinePass, OpenCode Go, or a ChatGPT plan (Sign in with ChatGPT), answering with generative UI from OpenUI, and doing real work on its own cloud VM from boat.dev. Built with TanStack Start, Effect, and the Cloudflare Agents SDK, installable on your phone, and with native apps for iPhone, iPad, and Android. See it at trydex.dev, then deploy your own.
Highlights · Features · Repository · Architecture · Develop · Deploy · Security · Limits · License
render_ui (OpenUI): cards, stat tiles, tables, charts, and forms. They work without a round trip to the model: filters, tabs, and toggles keep their own state (saved, so a card opens as you left it), Query() shows live Dex data (your chats, VMs, usage, workspace files, and read-only peeks into a chat's running VM: files, git status, ports, processes) that refreshes on its own while the card is on screen, and buttons run app operations with Mutation() or open a chat, file, or machine. Live data may only read; anything that deletes or changes settings shows Dex's own description of it to confirm first, button actions appear in the Access page's activity, and the chat hears what you did with its UI along with your next message. A UI with mistakes offers Fix it. Markdown tables wrap at word boundaries and scroll sideways in their own frame on a phone.vm_exec (output streams live), vm_computer (click, type, press keys, scroll, or drag on the desktop and get a fresh screenshot back in the same call, with coordinates in the screenshot's own pixels), vm_screenshot (one request, captured with ffmpeg), with only the newest 3 screenshots sent to the model each step so long computer-use runs stay fast, vm_read_file / vm_write_file, vm_expose_port (token-protected URLs), share_media, vm_stop.app_vm_files.SKILL.md and the files beside it. Install them from skills.sh, or write your own on the Skills page./ in any message opens a quick lookup of your skills and skills.sh matches, which install in place. A message starting with /<name> adds that skill's instructions to the chat from then on.use_skill when a request matches.Remote servers (Streamable HTTP or SSE) with no auth, headers (encrypted at rest), or OAuth (dynamic client registration with PKCE; the Agents SDK stores and refreshes tokens). Each server's tools appear as <server>__<tool>. Chats pick servers in the composer, agents preselect theirs, and servers marked "On for new chats" attach to plain new chats.
Search Smithery by default: it answers in well under a second, with use counts and verification, and its servers sign in through Smithery. Or search the official MCP Registry for publishers' own endpoints and packages.
Checks before you add one:
"Add server" opens the editor prefilled.
Local (stdio) servers: npm, PyPI, and Docker packages, or any command, run on a dedicated "MCP servers" VM. Each runs behind supergateway (stdio to Streamable HTTP, one port each), and Dex connects to its private address like any remote server.
$NAME without ever seeing the value.{{secret:name}}. VM tools fill placeholders in on the VM, as environment variables from a file the command sources and deletes.~/work, and runs the setup script before the model's VM tools go ahead./workspace/sidekicks/<id>/MEMORY.md), which you can edit on their page. They answer as themselves instead of as Dex, keep every tool, and can check in on their own with scheduled prompts. Start over begins a new conversation and keeps the memory; templates (Muse, Atlas, Sage, Rex) get you going. See docs/sidekicks.md.share_media. Dex stores them privately in R2, with seeking (byte ranges, which Safari needs), and deletes them with their chat.<input type="checkbox" switch> during the tap (not by laying switches over buttons, which stops lists from scrolling); Android uses navigator.vibrate. Fields never zoom the page on focus.Query() data and Mutation() buttons), the model and thinking menu, the queue, / skills, inbox triage, machines with the live desktop and a picture-in-picture preview, workspace files, projects, agents, skills, MCP servers, secrets, usage, and settings. They talk to the same agent as the web app over its WebSocket and RPC, so there's no server of their own.-DexMock on iOS, Try the demo in Android debug builds).Neither is in the App Store or Play Store yet: build them from their folders with Xcode or Gradle (each folder's README says how).
src/agent/operations.ts):
app_operations / app_call, so "start a chat per repo and have each open a PR" just works./api/mcp with a token from Settings → Access & API. Each token is Read, Read & write, or Full, and has an expiry.npm run check:ops (run by npm run deploy) fails if a new callable isn't covered or explicitly excluded./ for signed-out visitors shows what Dex does with the app's own screenshots and the tour; signed in, / goes straight to your chats.A monorepo, so the web app and the native apps live side by side and each builds and ships on its own:
apps/
web/ the app: TanStack Start UI, the Cloudflare Worker, and the DexAgent Durable Object
(its own package.json, wrangler.jsonc, and `npm run deploy`)
ios/ the native iPhone and iPad app (Swift, SwiftUI, XcodeGen; see apps/ios/README.md)
android/ the native Android app (Kotlin, Jetpack Compose, Gradle; see apps/android/README.md)
packages/ (planned) code shared between apps, e.g. the wire protocol
assets/ brand assets (the app icon source)
docs/ README screenshots and the promo video
The root package.json is an npm workspace (apps/web and packages/*). Its scripts forward to the web app, so npm run dev, npm run typecheck, and npm run deploy work from the root; npm run deploy:web is the explicit form. A JavaScript app joins by adding its folder to workspaces; native apps keep their own tooling (Xcode, Gradle) in their folder and their own release process.
Browser (TanStack Start, React)
│ HTTP: login, server functions WebSocket: RPC, synced state, Pi event stream
▼ ▼
Worker (src/server.ts) ── auth check ──► DexAgent Durable Object, one per user (src/agent/dex-agent.ts)
└─ TanStack Start handler ├─ PiHarness → Pi Durable (chats in the object's SQLite)
├─ ClinePass provider (openai-completions → api.cline.bot)
├─ OpenCode Go provider (completions, responses, messages, google → opencode.ai)
├─ ChatGPT provider (openai-responses → api.openai.com, Sign in with ChatGPT token)
├─ tools + Workspace (SQLite-backed files, just-bash)
├─ VmManager → boat.dev VMs (one per chat, plus the MCP VM)
├─ MCP client (remote servers; local ones via supergateway)
├─ Skills, secrets, message queue, media (R2), push
└─ Agents SDK schedules (scheduled prompts, queue checks)
In apps/web/src/:
server/: Effect services for config, keys (HMAC session signing, AES-GCM), sessions, and GitHub OAuth.agent/: the Durable Object and its parts (operations, VMs, MCP and registry search, skills, secrets, queue, media, push, the ClinePass, OpenCode Go, and ChatGPT providers) and the tools.shared/: model catalog, wire protocol, and shared types.client/: the agent connection (useAgent), the Pi event reducer, and UI components.routes/: pages and auth endpoints.npm install # from the root: installs every workspace
cp apps/web/.dev.vars.example apps/web/.dev.vars # set AUTH_SECRET; DEV_LOGIN=true enables the dev login
npm run dev # http://localhost:5173
Workers AI (web search and fetch) runs remotely even in dev, so run npx wrangler login first. After changing apps/web/src/client/openui/library.tsx, run npm run openui:spec -w @dex/web to regenerate the component spec the agent learns from. See AGENTS.md for the conventions every change follows (operations, skeletons, security, deploys).
The native apps build with their own tooling and can sign in to this dev server (with DEV_LOGIN=true):
open apps/ios/Dex.xcodeproj # Xcode 27; run the Dex scheme; apps/ios/scripts/test.sh runs the tests
cd apps/android && ./gradlew :app:installDebug # Android SDK 37 and a JDK 17+; ./gradlew test runs the tests
The web app deploys to Cloudflare Workers from apps/web. apps/web/wrangler.jsonc is the same for everyone; your deployment's settings live in the gitignored apps/web/.deploy.vars, which npm run deploy passes to Wrangler.
https://<your-domain> and callback https://<your-domain>/auth/github (sign-in and "Connect with GitHub" use paths under it), where <your-domain> is your custom domain or the Worker's workers.dev address.apps/web/.deploy.vars.example to apps/web/.deploy.vars and set ALLOWED_GITHUB_USERS (the first login is the owner), plus CLOUDFLARE_ACCOUNT_ID and VAPID_PUBLIC_KEY if you use the Usage page and push notifications. For a custom domain, add its zone to your Cloudflare account with a proxied DNS record for the hostname (an AAAA record to 100:: works), and set CUSTOM_DOMAIN (comma-separated, main one first, e.g. example.com,www.example.com): every deploy routes it to the Worker, and pages opened at the workers.dev address (or www) redirect to the main one. The deploy refuses to run without an allowlist.apps/web), then deploy from the root:cd apps/web
npx wrangler secret put AUTH_SECRET
npx wrangler secret put GITHUB_CLIENT_ID
npx wrangler secret put GITHUB_CLIENT_SECRET
npx wrangler secret put CLINE_API_KEY # optional shared key
npx wrangler secret put OPENCODE_API_KEY # optional: OpenCode Go key for the owner's chats; everyone else connects their own
npx wrangler secret put OWNER_PASSWORD # optional: password sign-in as the owner
npx wrangler secret put BOAT_API_KEY # optional: boat.dev key for the owner's VMs; everyone else connects their own
npx wrangler secret put CLOUDFLARE_API_TOKEN # optional: Account Analytics: Read, for the Usage page
npx wrangler secret put VAPID_PRIVATE_KEY # optional: push notifications (a P-256 private JWK; its public key goes in VAPID_PUBLIC_KEY)
cd ../.. && npm run deploy # checks operations, builds, and deploys apps/web
Sign-in:
DEV_LOGIN is set./auth/native/*, server/native-auth.ts): you confirm with a tap, the app gets a sealed one-time code at dex://auth/callback that expires in 2 minutes, and only the app holding the matching verifier can trade it for a session token.Sessions:
POST /auth/native/refresh.Stored secrets: API keys, tokens, MCP headers and env values, and saved and chat secrets are AES-GCM encrypted. Nothing secret is synced to the browser or returned by an operation.
Secrets and the model: the model only ever sees placeholders and names. Values reach VMs through files that commands source, and are masked in output.
Browser: a strict Content Security Policy:
connect-src 'self').Also COOP same-origin, HSTS, nosniff, a strict referrer policy, and a minimal Permissions-Policy. Model output is rendered without raw HTML.
VM desktop relay: /vm-desktop/<vm>/ serves Dex's own copy of the Selkies page and relays only the stream's WebSocket and Selkies' few API paths to the VM, adding the port cookie and password itself. Anything the VM answers is made inert on Dex's origin (a sandboxing CSP, no redirects, cookies, or CORS headers; files download as attachments), so a VM taken over by a prompt-injected agent can't run script as you. The stream's port is closed to the internet by boat's firewall.
127.0.0.1 loopback callback for open-source apps, and Dex runs on Cloudflare, so after approving, the browser lands on a page that doesn't load; you paste its address into Settings and the agent finishes the sign-in. OpenAI offers plan usage to open-source and locally run apps; a paid or hosted service needs OpenAI's approval first. OpenCode Go's allowance comes from an endpoint its docs don't list (what its console reads); if it changes, the Usage page says so and tokens are still counted./workspace shell is simulated (just-bash) and can't install or run programs; real work happens on a VM.web_search needs Web Search billing on the Cloudflare account.The Selkies web client in apps/web/public/assets/selkies is unmodified from its 2.0.0 release and is under the Mozilla Public License 2.0.
bash over a persistent /workspace (a simulated shell with grep, sed, jq, sqlite3, curl), file tools, web_search / web_fetch (Workers AI), schedule_prompt (one-off or cron), and use_skill./workspace/MEMORY.md joins every chat's system prompt; edits to it are always shown in the chat.BOAT_API_KEY serves only its owner.Workspace HTML previews: the page posts the file to /workspace-preview, which answers only signed-in, same-origin posts, with the HTML as its own document under a CSP sandbox (an opaque origin: no cookies, storage, or requests as you, no top navigation) that only Dex may frame.
Media: served only to its owner, for an allowlist of video, audio, and image types (never HTML, SVG, or PDF), sandboxed. VM uploads use single-use, HMAC-checked tokens.
MCP access tokens:
Prompt injection: tools run without approval, so text from the web or an MCP server can try to steer a chat. Anything lasting or destructive waits for your Confirm:
A tricked chat can still use a secret it has access to in a command, so give chats only the secrets they need.
Dependencies: npm audit reports no high or critical issues. KaTeX is pinned to a patched 0.18; the remaining moderate advisory is sprintf-js in the simulated workspace shell, with no upstream fix yet.