Codync
A free, open-source 1:1 alternative to Grok Bot and Muse. Message Claude Code, Codex, Cursor and 40+ coding agents as persistent bots from your iPhone, Mac or Linux desktop. Group chats, threads, appr
Connect remote/hosted MCP servers, trace payloads, configure custom models, and keep your keys local & secure. Zero backend costs.
Developer toolsGitHub @ownyourwebsiteOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
AI Playground by OwnYourWebsite
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗A developer-first, local-first LLM playground that integrates the Model Context Protocol (MCP) directly into your browser. Configure models, connect remote/hosted MCP servers, trace request/response payloads in raw JSON, and export production-ready snippets in seconds.
https://api.githubcopilot.com/mcp/) natively using your GitHub PAT.Use Node.js 22.23.3, pinned in .node-version, and install the locked dependency versions:
npm ci
cp .env.example .env.local # optional: configure environment variables (see below)
npm run dev
Open http://localhost:3000 to view the workspace.
RATE_LIMIT_REQUIRED=1, and keep RATE_LIMIT_FAIL_OPEN=0. Never enable ALLOW_PRIVATE_NETWORK on a public deployment. Keep Fluid compute enabled so long chat turns are not cut off at 60 seconds.Chats and keys belong to the browser and origin where they were saved; they do not automatically transfer from localhost or the demo to your deployment. The recovery import transfers backed-up chats/files, not provider keys. A hosted instance also cannot reach Ollama on your computer through its own localhost.
Click Settings in the bottom-left corner.
Configure a Custom Provider (Base URL, API Key, Model ID) for any OpenAI-compatible API, or expand Popular Providers to set keys and override default model IDs for:
sk-...)sk-ant-...)gsk_...)http://127.0.0.1:11434/api)Default models: gpt-5.6-luna (OpenAI), claude-sonnet-5 (Anthropic), qwen/qwen3.8-27b (Groq), llama3 (Ollama). Focusing a model field fetches the provider's current model list with the key/URL entered so far and offers it as suggestions; any ID can still be typed. A retired or misspelled ID produces an explicit model not found error. Custom providers and Ollama are called through the OpenAI-compatible /chat/completions endpoint (vLLM, LM Studio, OpenRouter, llama.cpp and similar servers).
Remember keys on this device defaults on and stores secrets as plain text in IndexedDB. Turn it off to keep secrets in this tab only; saved provider definitions remain, without their keys. Expiry is checked on load, not a background deletion timer. Saving a top-level key field refreshes its 30-day timestamp; older keys without a timestamp are preserved. Saved custom-provider keys have no per-key expiry.
get_me, get_file_contents, etc.) will load instantly!Connect any remote MCP server — not just the built-in GitHub preset — by adding it directly in the right sidebar.
Tavily Search).https://mcp.tavily.com/mcp).Authorization: Bearer <your-key>. Use "+ Add header" to add more than
one (e.g. an API key header plus a version header).Example: Tavily's remote MCP (
https://mcp.tavily.com/mcp) works with a singleAuthorization: Bearer <your Tavily key>header. This is just one example among many — the app is intentionally vendor-neutral, so you can plug in any Streamable HTTP / SSE MCP server.
Security note: MCP tool output is untrusted content. The model should treat tool results as data, never as instructions. Review tool arguments before approving, and only connect servers you trust.
13k / 131k tokens). The limit comes from the provider's model list when it reports one (Anthropic, Groq, OpenRouter-style servers); OpenAI does not, so only the used part is shown.Use Add attachments beside the message field, preview or remove files, then send with or without a text message. Text is read locally; images are sent as real multimodal input, not just filenames. Nothing is sent during selection/preview.
When a model "thinks" before answering, that hidden reasoning is surfaced in the Thought process accordion above each assistant reply. It is collapsed by default and shows a live "Thinking…" placeholder while it is still streaming.
The accordion is fed from two sources:
<think>, <thinking>, <reasoning>, and
<thought> are parsed client-side, stripped from the visible answer, and
shown under the accordion instead — with a fallback if a tag opens but never
closes.Reasoning content never bleeds into the main reply — the visible answer always stays clean.
store: false, so responses are not retained by OpenAI
for later retrieval and nothing depends on server-side conversation state.Skills are reusable instruction presets / prompt templates shown in the left sidebar with an icon. Four built-in skills are seeded on first run:
| Skill | Icon |
|---|---|
| Repo Explorer | folder-tree |
| Code Reviewer | code |
| Debugger | bug |
| Data Analyst | database |
Clicking a skill opens an editable instruction preview and a "use GitHub MCP"
toggle. Apply places the instructions into the input box for your next
message. You can create custom skills (choose a name, an icon including
sparkles, instructions, and an optional GitHub MCP toggle) and delete custom
ones. Everything is stored locally in IndexedDB via getSkills / saveSkill /
deleteSkill.
For local development, all environment variables are optional — the app works out of the box with an empty .env.local. Public deployments must configure abuse protection; see .env.example for placeholders and the security guidance for the trust boundary.
| Variable | Default | Description |
|---|---|---|
ALLOW_PRIVATE_NETWORK | (empty) | Private/LAN/localhost and http:// targets (MCP servers, Ollama, custom provider URLs, model lists) are allowed automatically under npm run dev and blocked in production builds (Vercel, Docker, next start). Set to 1 only on a self-hosted instance that must reach your own LAN; never on a public deployment. ALLOW_PRIVATE_MCP=1 is a deprecated alias. |
UPSTASH_REDIS_REST_URL | (empty) | Base HTTPS Upstash REST URL, without /pipeline or /multi-exec. With both credentials empty and RATE_LIMIT_REQUIRED=0, rate limiting is disabled for local use. |
UPSTASH_REDIS_REST_TOKEN | (empty) | Upstash Redis REST token (kept server-side only). |
RATE_LIMIT_CHAT_PER_MINUTE | 20 | Chat requests per 60-second window, per trusted IP or shared bucket. |
RATE_LIMIT_MCP_PER_MINUTE | 60 | MCP proxy requests per 60-second window, per trusted IP or shared bucket. |
RATE_LIMIT_MODELS_PER_MINUTE | 30 | Model-list requests (Settings suggestions, context limit) per 60-second window, per trusted IP or shared bucket. |
RATE_LIMIT_REQUIRED | 0 | Set to 1 on public deployments: absent/incomplete Redis credentials then produce HTTP 503 instead of silently disabling protection. |
RATE_LIMIT_FAIL_OPEN | 0 | Configured Redis failures return 503 by default. 1 explicitly permits requests during Redis failures; not recommended for public use. Invalid configuration still fails closed. |
RATE_LIMIT_IP_HEADER | (empty) | Operator-selected header containing one IP, overwritten by a trusted edge. No header means one shared bucket per scope; visitor forwarding headers are ignored. |
RATE_LIMIT_TIMEOUT_MS | 2000 |
Rate limiting uses one atomic Upstash REST transaction for the counter and TTL, with no extra npm dependencies or automatic retries. The 60-second window starts with the first request and is not extended by later requests. Quota exhaustion returns 429 with the remaining window in
Retry-After; Redis failures return 503 by default. Invalid/incomplete configuration is never silently accepted. All attempts consume quota, including requests later rejected by the handler.
Public deployment: set
RATE_LIMIT_REQUIRED=1, provide both Redis credentials and leaveRATE_LIMIT_FAIL_OPEN=0. WithoutRATE_LIMIT_IP_HEADER, all users share the chat, MCP and model-list limits separately. For per-IP quotas, choose a header only after verifying that your proxy/hosting edge overwrites it with one actual client IP and the origin cannot be reached directly. Comma-separated forwarding chains and missing/invalid selected headers are rejected with 503. The application cannot verify that your reverse proxy is trustworthy; rate limiting does not replace access control or edge-level abuse protection.
Private-network protection (SSRF): in production every server-side outbound request — MCP proxy, provider base URLs (Ollama, custom) and model lists — must target a public address; DNS answers are re-checked at connect time and redirects are not followed. A hosted app therefore cannot reach Ollama on your computer. For a self-hosted instance next to a local Ollama or LAN server, set
ALLOW_PRIVATE_NETWORK=1.
Function duration: the chat route declares
maxDuration = 300seconds and the MCP proxy90(a tool call waits up to 60 s). On Vercel Hobby this requires Fluid compute (enabled by default on new projects); without it Hobby caps functions at 60 s and long reasoning/tool turns are cut off.
Contributions are welcome! Please read our Contributing Guide for details on our code of conduct and the process for submitting pull requests.
This project is licensed under the MIT License - see the LICENSE file for details.
If you build something cool with this tool, please let us know! Open an issue or submit a PR to be featured here.
🌐 Brought to you by Own Your Website This playground is an open-source tool built and maintained by OwnYourWebsite - empowering developers and businesses with ready-to-deploy web solutions, embedded AI architectures, and full code ownership.
Main Ecosystem: ownyourwebsite.app
Live Playground: ai-playground.ownyourwebsite.app
| Absolute Redis deadline including response body, in milliseconds; positive integer up to 10000. |