{"id":45492010,"url":"https://github.com/hrayleung/jin","last_synced_at":"2026-04-23T05:00:56.022Z","repository":{"id":339923891,"uuid":"1150343551","full_name":"hrayleung/Jin","owner":"hrayleung","description":"MacOS native ChatBot that just works.","archived":false,"fork":false,"pushed_at":"2026-04-19T14:30:04.000Z","size":75715,"stargazers_count":6,"open_issues_count":3,"forks_count":2,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-19T16:35:40.824Z","etag":null,"topics":["chatbot","llm","macos","swift"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hrayleung.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-05T06:56:13.000Z","updated_at":"2026-04-19T14:30:06.000Z","dependencies_parsed_at":"2026-03-03T10:00:33.487Z","dependency_job_id":null,"html_url":"https://github.com/hrayleung/Jin","commit_stats":null,"previous_names":["hrayleung/jin"],"tags_count":77,"template":false,"template_full_name":null,"purl":"pkg:github/hrayleung/Jin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hrayleung%2FJin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hrayleung%2FJin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hrayleung%2FJin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hrayleung%2FJin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hrayleung","download_url":"https://codeload.github.com/hrayleung/Jin/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hrayleung%2FJin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32166660,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-23T02:19:40.750Z","status":"ssl_error","status_checked_at":"2026-04-23T02:17:55.737Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["chatbot","llm","macos","swift"],"created_at":"2026-02-22T17:17:44.896Z","updated_at":"2026-04-23T05:00:55.997Z","avatar_url":"https://github.com/hrayleung.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"tmp/banner.png\" alt=\"Jin Banner\" /\u003e\n\u003c/p\u003e\n\n# Jin\n\nA native macOS app for working with multiple LLM providers from one conversation workspace.\nConversation-first, tool-aware, and built for macOS instead of Electron.\n\n![macOS 14+](https://img.shields.io/badge/macOS-14%2B-000000?logo=apple\u0026logoColor=white)\n![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/code-exec.png\" alt=\"Code execution with generated visualization in chat\" width=\"1200\" /\u003e\n\u003c/p\u003e\n\n## Why Jin\n\n- **Conversation-first** — Built around chat flow and fast iteration, not workspace clutter\n- **Provider-aware controls** — Exposes model-specific settings like reasoning, search, caching, PDF handling, service tier, code execution, and media options instead of hiding them behind generic presets\n- **Native macOS workflow** — SwiftUI app with drag-and-drop, split views, custom keyboard shortcuts, recovery tools, and Sparkle updates\n- **One app for chat + tools** — Chat, MCP, built-in search, artifacts, voice, coding workflows, and media generation live in the same workspace\n\n## Features\n\n- **Multi-provider chat** — Work across OpenAI, Anthropic, Gemini, Vertex AI, xAI, gateway providers, and more from one app\n- **Parallel multi-model chat** — Add up to 3 models to one conversation, compare responses side-by-side, and keep per-model context independent\n- **Multimodal threads** — Mix text, images, files, audio, PDFs, and generated media in one conversation\n- **Markdown, code, and LaTeX rendering** — Syntax-highlighted code blocks, markdown rendering, inline/block math, and copy-friendly output\n- **Reasoning and advanced model controls** — Per-chat controls for reasoning budget, web search, prompt caching, PDF mode, OpenAI service tier, and other provider-specific options\n- **Search and grounding** — Provider-native web search plus built-in search plugins, source cards, citation timeline, and Google Maps grounding for Gemini / Vertex AI\n- **MCP tool calling** — Connect external tools and data through MCP servers over stdio or HTTP, with persistent or ephemeral server lifecycles\n- **Agent and coding workflows** — Codex App Server support with per-chat working directory, sandbox mode, and personality controls, plus optional local Agent Mode for shell/file/search tools through the bundled RTK helper\n- **Provider-native code execution** — Run supported model-side code execution flows with visible activity timeline, logs, generated images, and downloadable files\n- **Artifacts workspace** — Inline HTML, React, and ECharts artifacts with split-pane preview, version history, source export, and reusable artifact IDs\n- **Image and video generation** — Image generation/editing and video generation flows across supported providers, including source-image or source-URL based edit workflows where available\n- **PDF and OCR handling** — Native PDF upload where supported, Mistral / DeepSeek OCR modes, plus local macOS extraction fallback\n- **Voice workflows** — Speech-to-text and text-to-speech via cloud providers or on-device WhisperKit / TTSKit models\n- **Assistants and defaults** — Named assistants with custom prompts, language preference, model defaults, temperature/output settings, and optional history truncation\n- **macOS polish** — Configurable shortcuts, drag-and-drop attachments, storage breakdown, recovery pack export/import, and in-app Sparkle update controls\n\n## Screenshots\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/multi-model-chat.png\" alt=\"Parallel multi-model conversation in one chat with side-by-side responses\" width=\"1200\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/code-highlight.png\" alt=\"Syntax-highlighted code blocks in a conversation\" width=\"1200\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/latex.png\" alt=\"LaTeX math rendering in a conversation\" width=\"1200\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/chat-web-search.png\" alt=\"Chat with in-thread web search and source timeline\" width=\"1200\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/tool-calling.png\" alt=\"Tool calling flow with MCP tools in chat\" width=\"1200\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/artifact.png\" alt=\"Interactive artifact with React component rendered in split workspace\" width=\"1200\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/image-generation.png\" alt=\"Image generation result in a conversation\" width=\"1200\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/video-generation.png\" alt=\"Video generation playback in chat\" width=\"1200\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/provider-settings.png\" alt=\"Provider and model settings panel\" width=\"1200\" /\u003e\n\u003c/p\u003e\n\n## Supported Providers\n\nConfigure providers in **Settings \u003e Providers**. Jin supports direct providers, gateways, and coding-focused runtimes:\n\nOpenAI · OpenAI (WebSocket) · Anthropic · Gemini (AI Studio) · Vertex AI · xAI · Perplexity · Groq · Cohere · Mistral · DeepInfra · Together AI · Fireworks · SambaNova · DeepSeek · Zhipu Coding Plan · MiniMax · MiniMax Coding Plan · MorphLLM · OpenCode Go · GitHub Copilot · OpenRouter · OpenAI Compatible · Cloudflare AI Gateway · Vercel AI Gateway · Codex App Server (Beta) · Cerebras\n\n- **Most providers** use an API key.\n- **Vertex AI** uses a service account JSON.\n- **Codex App Server** can use an API key, ChatGPT account login, or local Codex auth from `$CODEX_HOME` / `~/.codex`. Jin can also launch a localhost `codex app-server` for you from provider settings. Recommended runtime: `codex 0.107.0+`.\n- **Gateway providers** such as OpenRouter, Cloudflare AI Gateway, Vercel AI Gateway, and OpenAI Compatible can route upstream models while still benefiting from Jin's model metadata when the exact upstream model ID is known.\n\n### Model Catalog\n\n- Jin ships with curated seed models for major providers so you can start chatting immediately after adding credentials.\n- Use **Fetch Models** to pull fresh provider model lists when the provider supports catalog fetching.\n- You can also add model IDs manually, including gateway-prefixed IDs like `openai/...` and `anthropic/...`.\n- Known models use exact-ID capability metadata for context window, reasoning behavior, vision, web search, PDF handling, code execution, image/video generation, and other features.\n- Unknown model IDs still work, but Jin falls back to conservative defaults until metadata is available.\n\n## Plugins\n\nAll plugins are optional and configured in **Settings \u003e Plugins**.\n\n| Plugin | Services |\n|--------|----------|\n| Web Search | Exa, Brave Search, Jina Search, Firecrawl, Tavily, Perplexity Search |\n| Text-to-Speech | OpenAI, Groq, ElevenLabs, TTSKit (on-device) |\n| Speech-to-Text | OpenAI, Groq, Mistral, WhisperKit (on-device) |\n| Mistral OCR | Mistral OCR for PDF extraction |\n| DeepSeek OCR | DeepSeek OCR via DeepInfra for PDF extraction |\n| Chat Naming | Automatic conversation naming with a selected model |\n| Cloudflare R2 Upload | Upload local videos to R2 and use public URLs in video workflows |\n| Agent Mode | Local shell/file/search tools via the bundled RTK helper and local file operations |\n\n## MCP (Model Context Protocol)\n\nConnect MCP servers under **Settings \u003e MCP Servers**.\n\n- Supports **persistent** and **ephemeral** server lifecycles\n- Supports **stdio** and **HTTP** transports, including streaming HTTP setups\n- Supports server presets plus `mcpServers` JSON import\n- Keeps per-server tool enablement and per-chat MCP selection separate\n- Supports HTTP authentication with bearer token or custom headers\n\n## Installation\n\n### Download\n\nDownload the latest release from the [Releases](../../releases) page.\n\n- Release assets typically include `Jin.zip`, and release automation may also publish `Jin.dmg`\n- Jin uses [Sparkle](https://github.com/sparkle-project/Sparkle) for in-app updates after installation\n- Current packaged builds are **Apple Silicon-only**\n- If your release is zipped, unzip it first\n\n### If macOS blocks the app\n\nIf macOS shows a warning like \"is damaged and can't be opened\" or \"Apple could not verify\":\n\n1. Move `Jin.app` to `/Applications`.\n2. Right-click `Jin.app` and choose **Open** once.\n3. If it is still blocked, open **System Settings \u003e Privacy \u0026 Security**.\n4. Click **Open Anyway** for Jin, then confirm **Open**.\n5. If needed, clear quarantine and retry:\n\n```bash\nxattr -dr com.apple.quarantine /Applications/Jin.app\n```\n\n### Requirements\n\n- Apple Silicon Mac for packaged release builds\n- macOS 14 (Sonoma) or later\n\n## Getting Started\n\n1. Launch Jin.\n2. Open **Settings \u003e Providers** and add a provider credential. Most providers use API keys, Vertex AI uses a service account JSON, and Codex App Server can be configured without an API key if you use ChatGPT or local Codex auth.\n3. Start a new conversation and pick one model, or add up to 3 models to the same chat.\n4. Optional: enable plugins in **Settings \u003e Plugins** for search, OCR, voice, cloud upload, or local Agent Mode.\n5. Optional: add MCP servers in **Settings \u003e MCP Servers** for tool calling.\n6. Optional: customize **General** settings for appearance, keyboard shortcuts, chat defaults, updates, and data / recovery tools.\n\n## Build from Source\n\n```bash\ngit clone https://github.com/hrayleung/Jin.git\ncd Jin\nswift build\nswift test\nswift run Jin                 # Run from the command line (Debug)\nopen Package.swift           # Open in Xcode\nbash Packaging/package.sh    # Build arm64 .app bundle and create dist/Jin.zip\nbash Packaging/package.sh dmg\n```\n\n`Packaging/package.sh` also bundles the RTK helper used by Agent Mode into the final app bundle.\n\nRequires Swift 5.9+ / Xcode 15+.\n\n## Updates \u0026 Release\n\nJin uses [Sparkle](https://github.com/sparkle-project/Sparkle) for in-app updates.\n\n- **Settings \u003e General \u003e Updates** exposes automatic update checks and optional pre-release channel opt-in\n- Update feed and signing key are configured in `Packaging/Info.plist` (`SUFeedURL`, `SUPublicEDKey`)\n- The appcast lives at `docs/appcast.xml`\n- CI packaging, signing, notarization, and release publishing live in `.github/workflows/ci-cd.yml`\n\n## Contributing\n\nContributions are welcome. Unless explicitly stated otherwise, contributions are accepted under the same [Apache License 2.0](LICENSE).\n\n## License\n\n[Apache License 2.0](LICENSE) — permissive open-source licensing with an express patent grant. See the [full license text](https://www.apache.org/licenses/LICENSE-2.0) for details.\n\n## Acknowledgments\n\n- [MCP Swift SDK](https://github.com/modelcontextprotocol/swift-sdk) — Model Context Protocol client library\n- [Sparkle](https://github.com/sparkle-project/Sparkle) — In-app update framework for macOS\n- [Lobe Icons](https://github.com/lobehub/lobe-icons) — Provider icon assets\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhrayleung%2Fjin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhrayleung%2Fjin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhrayleung%2Fjin/lists"}