跳到正文
GitHub·· 8 天前AI 评分46

NomiFun Desktop:完全开源、本地优先的超级 AI 工作站

nomifun/nomifun-desktop

AI 导读

NomiFun 推出完全开源、本地优先的超级 AI 工作站 NomiFun Desktop,采用 React 前端与 Rust 后端,数据全部留在本机,无云账号、无遥测、无订阅,个人和企业均可免费商用。Desktop 作为本地数据、模型、Agent、任务与工具中枢,通过 WebUI 让 Mobile 在局域网直连复用会话,并支持 Xiaozhi 机器人与自托管 NomiRelay 跨网中继。

正文

NomiFun Desktop home with two custom companions

A no-holds-barred, fully open-source, local-first super AI workstation.

Rich, inventive capabilities and serious productivity gains —
with all your data staying on your own machine. Safe for individuals and enterprises, free to commercialize, open to audit.

License: Apache-2.0 Platform Status Website

Built with Tauri 2 Rust 2024 React 19 Stars

English · 简体中文

🌐 Website ·  📖 Docs ·  🚀 Get started ·  📦 Releases ·  🇨🇳 Gitee source ·  China mirror ·  发版手册 ·  💬 Community


Important

Public-interest open-source and data-risk notice: NomiFun is a public-interest open-source project. The maintainers do not assume responsibility for user data loss, corruption, or unrecoverable damage during iteration. Back up your data before upgrades, migrations, experimental features, or real production use.


NomiFun is everything you imagine an AI workstation to be — and it runs on your terms. One React frontend and one Rust backend give you an evolving desktop companion, an unattended automation platform, a unified knowledge base, native computer- and browser-use, and an open capability bus that any agent can drive. No NomiFun cloud account. No telemetry. No subscription. Your workspace data stays local; requests go to the model services you configure, including model invocation, model catalogs, and quota queries.

The product name is NomiFun. Lowercase nomifun is used only for code identifiers, crate names, environment variables, and repository paths.


NomiFun open-source product family

NomiFun has four runtime projects plus NomiFun Portal, the canonical documentation home. Desktop is the local AI, data, model, Agent, task, and tool hub; Mobile and the Xiaozhi robot connect to capabilities that you explicitly enable, while Net Infra provides an optional, self-hosted cross-network relay. Desktop also hosts Unified Plugins, so a locally authored Plugin can keep using the same governed runtime and capabilities instead of becoming an isolated demo.

Project Role Start here
NomiFun Desktop (this repository; GitHub · Gitee) Local source of truth and runtime for data, models, Agents, tasks, Skills, knowledge, Unified Plugins, WebUI, REST and MCP Download · Product docs · WebUI remote access
NomiFun Mobile (GitHub · Gitee) Android / iOS / H5 client that directly reuses Desktop sessions, tasks, requirements, companions and administration Mobile guide · Enable Remote & Open → WebUI access in Desktop, then scan its one-time QR code
NomiFun Xiaozhi Yuntai (GitHub · Gitee) ESP32-S3 Xiaozhi robot and pan-tilt platform for voice, motion and device-side multimodal interaction Xiaozhi guide · Firmware source: nomifun-xiaozhi-yuntai
NomiFun Net Infra (GitHub · Gitee) Self-hosted NomiRelay infrastructure for exposing Desktop or other HTTP/WebSocket/TCP/UDP services behind NAT across networks Product page · Portal guide · Relay docs
NomiFun Portal (GitHub) Canonical product-use documentation, onboarding, screenshots, walkthroughs, and end-user troubleshooting for the ecosystem English docs · 中文文档

Connect the four projects

  1. Run Desktop, configure the models/companions you need, and keep all data on that machine.
  2. For Mobile, open Remote & Open → WebUI access, start the listener, and scan the short-lived, one-time QR code from the Mobile app. On a LAN, Mobile connects directly to Desktop with no NomiFun cloud relay. Desktop remains the authority and server; the phone is an authenticated client, so model credentials and the durable data set do not need to be copied to the phone.
  3. For Xiaozhi, build and flash the Yuntai firmware, then follow the companion Remote control → Robot connection flow in Desktop to bind the device.
  4. When access must cross networks, self-host NomiRelay and nfagent, then point Mobile at the relay business endpoint. Mobile never receives relay admin credentials, and Desktop remains the application-data authority.

Only enable remote interfaces on networks you trust. The Desktop guides above document authentication, LAN exposure, and deployment boundaries.

One local hub, many interaction surfaces

This is not a collection of unrelated clients that happen to share a logo. Desktop owns the durable state and executes models, Agents, requirements, tools, knowledge, companion memory, and Skills. Mobile is a direct LAN control surface; Xiaozhi is a voice-and-motion hardware surface; Unified Plugins are interactive software surfaces created and hosted by the same Desktop installation; Net Infra is an optional transport layer rather than another application backend. The result is one governed capability graph with multiple ways to reach it, rather than separate clouds, accounts, credentials, and copies of user data.

Read the NomiFun product ecosystem architecture for the trust boundaries, communication model, differentiators, and product innovation timeline. Simplified Chinese: product-ecosystem.zh.md.


✨ Why NomiFun

🔓 Open & local Source fully open, no reservations. Data lives on your machine and is never sent out on its own. Free for personal and commercial use. Open to audit.
🐾 Evolving companions The most complete companion-growth system we know of — it learns how you work and gets better over time. Not just a buddy, a genuine productivity partner.
🤖 Unattended automation Manage requirements, then just give the order. AutoWork + IDMM keep your sessions alive and working reliably while you're away.
🌐 Open capability ecosystem Everything is here, everything connects, everything cooperates — and any agent can borrow NomiFun's powers over MCP / REST.
🧩 Config once, use anywhere Unified management of knowledge bases, skills, agents, MCP servers, and models — defined once, reused across every surface.
🖥️ Truly native In-process, self-built computer use and browser use as native tools — more capable, faster, and cheaper on tokens.
🚀 Built for productivity Designed from real needs, with a lot of inventive capabilities. And many delightful features are still on the way.

🔒 Local-first, by design

Data security is not a setting in NomiFun — it is the architecture.

  • All data is local. NomiFun never proactively sends your data anywhere. Model-service requests go to the services you explicitly configure, including model invocation, model catalogs, and quota queries. See the FAQ for other network features you can choose to use.
  • Safe for anyone who cares about data. Individuals and enterprises with strict data-handling requirements can use it with confidence. The code is fully open and open to audit.
  • We cut features to keep this promise. To guarantee your data stays yours, we deliberately dropped several advanced, genuinely fun feature designs. Everything here is in service of letting users — and developers — relax.
  • No ads. No membership tiers. The official project conducts no commercial operations. We will never charge for any feature of this project, and the official project does not operate any paid services. The only expense is model tokens, which you pay directly to the model service you choose.

See SECURITY.md for the deployment threat model and responsible-disclosure policy.


🖼️ See the product

🎬 Demo videos: China: Bilibili  |  International: YouTube

Current NomiFun Desktop workspace with the refreshed English sidebar
Workspace · conversations, Agents, tasks, tools, and connected devices in one desktop

NomiFun 0.8.0 Canvas workspace with generated coffee-brand visuals
Creative Studio · persistent Canvases, media node composers, reusable prompts and assets, and templates

NomiFun multi-model management
Multi-model management · providers, capabilities, and task-aware routing
NomiFun desktop companions
Desktop companions · persona, memory, models, and remote control
Current NomiFun Skills Hub
Skills Hub · reusable, governed Agent capabilities
More Creative Studio screens follow below
The numbered gallery covers the current Canvas, asset libraries, templates, Assistant, skills, and companion workflow.

Captured from NomiFun Desktop 0.8.0 on October 8, 2026, with example conversations, generated images, assets, and templates. See the screenshot manifest for source, synchronization, and usage details.


🎨 Creative Studio — the new creation surface

Creative Studio is a new, focused creation surface inside NomiFun Desktop—not a single marketing screen. The numbered gallery follows the product surfaces a creator can actually open: persistent Canvases with media-node composers, Prompt Center, My Assets, private templates and AI Create, multi-image series, Canvas Assistant, explicit Creative Studio skills, and an optional native desktop companion.

Creative Studio coffee-brand example canvas
Canvas workspace · a brand brief and three generated visuals, ready to reuse in assets and templates
Creative Studio Canvas Library
Canvas Library · create, open, manage, import, and export persistent Canvases
Creative Studio Prompt Center
Prompt Center · a searchable, attributed prompt catalog with categories, tags, copy, and save-to-assets actions
Creative Studio My Assets library
My Assets · reusable text, image, video, and audio assets with filters, collections, tags, and pickers
Creative Studio Template Studio
Template Studio · private single-image and multi-image-series templates with variables and exact model settings
Creative Studio AI Create template editor
Template Editor · reusable variables, prompts, exact models, aspect ratios, and resolution
NomiFun companion workspace
Companion workspace · companion figure, persona, model, memory, Skills, and the Show on desktop control
NomiFun native desktop companion with a generated brand tagline
Native desktop companion · quick replies and a real coffee-brand tagline

The 0.8.0 gallery covers the Canvas library and workspace, prompts, assets, templates, and companions. Replaced screenshots and captures of retired standalone workbenches have been removed. The Skills Hub capture above shows the Creative Studio skill packages as reusable capabilities. All captures should represent the running product, not a mockup or an invented capability. See docs/images/SCREENSHOTS.md for the capture manifest.

For the user-facing guide, see docs/guides/creative-studio.md; the same content is mirrored on NomiFun Portal.


🚀 Feature highlights

NomiFun Desktop has grown from an Agent chat client into a local, extensible AI workspace. Its major product surfaces now share the same conversations, models, memory, tools, permissions, and execution runtime:

Product surface What it adds
Multi-Agent execution cluster Plans dependency-aware work, delegates steps to specialized Agents, schedules parallel execution, and exposes live state, transcripts, approvals, retry, and recovery.
Unified Plugins Creates or imports one package, validates and installs one Artifact, runs optional App/Service entrypoints, exposes Action/Binding capabilities, and provides generation-safe storage, backup, restore, and deletion.
Creative Studio Adds a persistent Canvas with media-node composers, Prompt Center, My Assets, private templates, AI Create, multi-image series, Canvas Assistant, Creative Studio skills, and optional companion-in-the-workspace collaboration.
Task-aware multi-model control plane Separates provider credentials from model records, accepts native and compatible/custom endpoints including local or self-hosted services, and routes chat, realtime, speech, vision, media generation, embedding, and reranking with per-task fallback.
Phone, robot, and open access Pairs Mobile directly with Desktop, binds a Xiaozhi robot to a companion, and exposes governed capabilities through WebUI, REST, MCP, IM channels, and NomiRelay.

🐾 Desktop Companion — it grows with you

Product guide: docs/guides/companions.md · Portal mirror

The companion you talk to every day quietly becomes the partner who gets you.

  • Make it yours. Upload a custom companion figure (DIY), or pick from an independent figure library decoupled from any single companion.
  • A family, not a hive mind. Run multiple companions side by side, each a complete individual with its own chat model, persona, memory, and domain knowledge bases. Memory belongs to exactly one companion — nothing you tell the work companion leaks into the one you chat with at home.
  • A place of their own. Companion chat, identity and management now live together in Desktop Companion. Work Sessions stay focused on projects and tasks, while the native quick window lets you switch companions and reply without opening the full workspace.
  • It learns you (opt-in, on by default after a one-time consent). A background learner distills your usage into durable memories; a deterministic evolution engine mines your recurring multi-step tool sequences into draft skills it proposes for your review. Memory is fully visible and editable.
  • Skills it writes itself. Companions distill their own skills out of real work and discuss them with you before anything is kept.
  • A super gateway, not just a buddy. Each companion is a complete, independent individual that can connect to multiple IM channels. From anywhere with a network and a chat app, message your companion to drive your computer for you. Each companion can fully operate the desktop's capabilities.

🤖 XiaoZhi robot — give your companion a physical presence

Product guide: docs/guides/xiaozhi-robot.md · Portal mirror · Firmware: nomifun-xiaozhi-yuntai

Connect a compatible XiaoZhi ESP32 robot directly to NomiFun over your LAN. The robot supplies the microphone, speaker, display, servos, and device-side MCP tools, while NomiFun supplies the companion's persona, models, memory, ASR, TTS, sessions, and tool coordination. Setup is built into each companion's Remote control → Robot connection page: copy its OTA address, enter the six-digit activation code shown by the robot, and bind the device to that companion.

🧩 Unified Plugins — create and run governed local software

Create a Plugin through Chat or import a package directory/ZIP. Both sources enter the same validation and install_artifact path. A local Plugin points to one active immutable Artifact and one generation DataRoot; optional UI and Service entrypoints cover UI-only, headless, and mixed Plugins without separate product models. Actions bind directly to Agent, Desktop, and Automation points through stable plugin:<plugin_id>/<action_id> identities.

The unified SDK exposes SQLite, KV, Files, memory-only Cache, Config, Credential references, Host capabilities, and cross-Plugin Actions. Preview uses the same Bridge and storage adapters against a temporary DataRoot. Package export excludes user data; Backup includes current data and non-secret config but never Credential plaintext. See the Plugin Platform architecture.

🎨 Creative Studio — focused creation on an infinite canvas

Product guide: docs/guides/creative-studio.md · Portal mirror

Creative Studio is a persistent creative document system, not a disposable whiteboard. An infinite Canvas stores text, image, video, audio, timeline, config, and group nodes. Media nodes own the visible creation surface; config nodes keep the exact provider/model/task, typed parameters, ordered inputs, task state, and results auditable. The Canvas Assistant proposes typed graph operations, validates them fail-closed, and waits for Apply to Canvas—it never silently mutates the document or runs generation in the background.

Canvas media nodes cover the full generation matrix: Image supports T2I and I2I with real reference assets, Video supports T2V and one-image I2V, and audio creation runs through Canvas audio nodes and TTS. Prompt Center provides searchable, attributed prompt collections, while My Assets stores reusable text, image, video, and audio assets with kind filters, collections, tags, metadata, and pickers. Reference images are hydrated by asset ID, so reloads never reuse stale browser objects.

Canvas Assistant turns a creative request into a Canvas-scoped proposal, and the composer requires explicit selection of 1–3 Creative Studio skills: Canvas planning, Organize layout, or Template design. These skills shape the proposal; they are not inferred from arbitrary prompt wording, and applying a proposal still requires the user’s explicit confirmation.

Template Studio turns prompts, variables, exact model bindings, and output plans into private reusable templates. AI Create produces one strict draft for review; Apply opens an in-memory editor draft and only explicit Save persists it. Multi-image series can require review before generation.

Every operation carries an exact enabled { providerId, model, task } identity: chat for Assistant and template drafting, image_generation/image_edit for T2I/I2I, video_generation for T2V/I2V, and speech_synthesis for TTS. Canvas writes use revision-based CAS; conflicts stop automatic saving instead of overwriting newer work, and task history reconciles the exact owner after reload. Canvas ZIP v3 exports the validated document and referenced asset closure while the v1/v2 readers remain supported.

🧠 Multi-Agent execution cluster — plan, schedule, supervise

Start from a normal Agent conversation. When a task deserves specialization or parallel work, NomiFun creates one persistent AgentExecution aggregate linked to that Conversation, plans a dependency graph, and schedules ready steps across delegated Agents while the lead Agent remains the control point.

  • Dependency-aware scheduling. Independent steps can run concurrently; blocked steps wait for their prerequisites instead of racing on incomplete context.
  • Per-step preflight control. Override a delegated Agent's model and add a preset brief before it starts; completed or failed steps can be retried with the same configuration.
  • Review before execution. Approval-enabled collaboration pauses after planning and presents the graph in the conversation so you can adjust it before work begins.
  • Live, real transcripts. Follow state changes and open any step's actual Agent conversation, then return to the lead conversation to keep supervising the whole cluster.
  • Recovery is part of execution. Persisted state supports retry and restart recovery instead of reducing a cluster run to disposable background messages.

🤖 Unattended automation — Requirements + AutoWork + IDMM

Product guides: Requirements & AutoWork · Intelligent decision (IDMM)

You give the orders; NomiFun reliably does the work.

  • Requirement platform — a CRUD store with ordered rotation, a board/kanban, tags, and per-item claim.
  • AutoWork — claims pending requirements, drives a turn, rotates to the next, and renews leases while a turn is in flight. Targets are canonical AgentSessions bound to a saved Agent.
  • IDMM (Intelligent Decision-Making) — per-session supervision that keeps agents alive through provider faults and decision stalls, with a no-LLM rule tier and a sidecar backup-model tier, stacking on top of AutoWork.
  • Notify out — completion notifications to Lark/Feishu custom bots, Slack, and HTTP webhooks.

📚 Unified Knowledge Base

Product guide: docs/guides/mcp-and-skills.md · Portal mirror

Pull the knowledge scattered across your system into one managed, trackable place.

  • Centralized management & tracking — create, mount, and track consumers across conversations, terminals, and companions.
  • Safe write-back — a code-enforced, per-surface write policy. Every mount picks its write-back disposition: manual (the default — nothing is written back unless you ask for it in the conversation) or automatic (the agent decides on its own, and only writes what it is confident is durably worth keeping). Either way an update appends to the existing document under compare-and-swap, so a write-back can add to the text you curated but never overwrite it.
  • Real-time URL snapshot — turn any web page into a knowledge source (SSRF-guarded fetch, HTML→Markdown), in snapshot (persisted, re-fetchable) or live mode.
  • Scoped retrieval — agents call a knowledge_search tool whose scope is decided server-side and cannot be widened.

🖥️ Native Computer Use & Browser Use (desktop build)

Product guide: docs/guides/computer-browser-use.md · Portal mirror

Self-built, in-process Rust — no Playwright, no Node, no third-party automation daemon. More capable, faster, and far cheaper on tokens, with fine-grained control and fully open source for you to extend.

  • Computer use — accessibility tree + Set-of-Marks overlay + OCR, steering the model to act on real UI elements instead of guessing pixels. macOS (AXUIElement + Vision OCR) and Windows (UI Automation) are complete; Linux (AT-SPI2) is partial.
  • A real browser inside the conversation — the desktop embeds native WebView2 on Windows and system WKWebView on macOS 14+ (Apple Silicon and Intel); Linux is deferred. The user and the Agent share one live page with tabs, navigation, forms, history, isolated sign-in state, WebSocket and HMR. On macOS, Agent interaction uses semantic page actions for ordinary buttons and forms; advanced gestures and automatic file transfer are explicitly unsupported. See the platform capability matrix.
  • One simple input rule — while the Agent is running, browser input belongs to the Agent and the user watches the real interaction. When the turn ends, the user can operate the page directly. There is no pause-and-take-control workflow.
  • Frontend testing without a separate test product — an enabled Agent can observe rendered elements and use real mouse, keyboard, drag, upload, download, and dialog interactions to test an app it is building. There is no Browser console, problem list, test-step panel, or special test mode.
  • Conversation-owned state — each persistent conversation has its own browser profile and tabs. The Browser opens from that conversation rather than a global management page or Browser settings center; site data and downloads stay in the small in-context browser menu.
  • Optional web research — the web.research capability module gives models without provider-native search a separate, selectable public-web research surface. It runs in an isolated background browser and never reads session tabs or sign-in state.
  • Optional attached-Chrome provider — an Agent session's browser capability can be served by an already-running, signed-in Chrome on Windows (/api/browser-providers/attached-chrome). NomiFun does not launch Chrome, import profiles, or move credentials into the embedded browser.
  • No hidden interactive fallback — isolated headless Chromium is reserved for local search and content rendering. Interactive Browser work always targets the native conversation surface, and failure to create that surface is reported instead of silently switching engines.

ℹ️ Computer/browser control ship with the desktop app. The headless web/server host omits them by design.

🌐 Open capability bus — MCP + REST

Product guide: docs/guides/remote-capability-api.md · Portal mirror

External agents drive NomiFun through a canonical remote-AgentSession surface — an explicit, token-scoped contract rather than a generic tool dump.

  • MCP front door at /mcp (Streamable-HTTP, installation token) exposing exactly open, turn, observe, and cancel. Point Claude Code, Cursor, or your own agent at it and they drive durable AgentSessions.
  • Canonical REST at /api/remote/{open,turn,observe,cancel} for clients that prefer plain HTTP over MCP.
  • RemoteBindings managed locally at /api/remote-bindings pin which Agent/capabilities a remote token may open; WebUI remote access uses /api/webui/access-token.

🧩 One built-in agent, many models

Product guide: docs/guides/model-routing.md · Portal mirror

  • Built-in nomi agent — no extra install, and the only conversation engine. Works with 26+ model providers/presets (OpenAI, Anthropic, Gemini + Vertex AI, AWS Bedrock, DeepSeek, OpenRouter, Moonshot/Kimi, Qwen/Dashscope, Zhipu/GLM, MiniMax, SiliconFlow, xAI, Volcengine/Doubao, and more) across 4 wire protocols, plus the New API aggregator gateway.
  • One code path — every conversation runs the same engine, so capabilities, tool policy, approvals, and failover behave identically no matter which model you pick.
  • Want Claude Code, Codex, or Gemini CLI? Run them in terminal mode — real in-app PTY sessions with NomiFun's capabilities injected through each CLI's own native config. See the Portal terminal guide.
  • Everywhere — the native capabilities are available to the built-in agent, in the chat UI, and in the terminal.
  • Graceful multimodal fallback — if a selected provider/model rejects image input, NomiFun strips the images, retries in the same conversation, and leaves an inline notice instead of killing the session.
  • Per-model context tuning — override context-window limits per model when an upstream platform reports bad defaults or hides them, improving routing and long-context budgeting.

🔌 Multi-model control plane — providers, capabilities, and routing

NomiFun separates provider credentials from model records and capabilities. Extend the catalog with native providers, compatible protocols, custom base URLs, or local and self-hosted endpoints. Enter a model id directly, then configure independent routes when realtime, ASR, TTS, image generation/editing, video generation, embedding, or reranking needs a separate interface. Chat input and technical features require no capability checkboxes. Routing is task-aware, supports per-model context and output limits, and can fail over without pretending that every provider uses the same URL, protocol, or auth.

Model suggestions do not restrict manual entry. Independent tasks use their saved provider and protocol routes; Chat features depend on protocol support and actual provider responses rather than omitted capability tags. Creative Studio carries the exact { provider, model, task } identity into every media operation, so a same-named model from another provider is never substituted silently.

For your own providers, pick by region, price, quota, capability, and data policy, then add the credentials on Models & Agents. The following services are third-party offerings; their pricing, availability, rate limits, and data terms remain under each provider's control.

Provider Start here Good to evaluate
StepFun logo StepFun Platform Step models for Chinese, agentic, and cost-conscious workloads
Kimi logo Kimi / Moonshot AI API keys Long context, Chinese writing, coding, and general tasks
GLM logo GLM / Zhipu BigModel API keys GLM models, general reasoning, coding, and enterprise integration
Doubao logo Doubao / Volcengine Ark API keys Doubao models and China-region cloud/enterprise workflows
Qwen logo Qwen / Alibaba Cloud Model Studio API keys Qwen models, DashScope, and Alibaba Cloud workflows
MiniMax logo MiniMax / MinMax API keys MiniMax models, long-form text, multimodal, and voice capabilities
MiMo logo MiMo / Xiaomi Website MiMo models and Xiaomi ecosystem capabilities
DeepSeek logo DeepSeek API keys Reasoning, coding, and high value-for-money model calls
OpenRouter logo OpenRouter API keys Multi-model aggregation, unified billing, fallback routing, and comparison
Claude logo Claude / Anthropic API keys Claude models, long-form work, coding, and the Claude Code ecosystem
OpenAI logo GPT / OpenAI GPT models · API keys GPT models, OpenAI API, agent workflows, coding, and general-purpose tasks
Gemini logo Gemini / Google AI API keys Gemini models, multimodal work, very long context, and Google AI Studio

💻 Terminal mode — where third-party agent CLIs live

Product guide: docs/guides/terminal.md · Portal mirror

Run agent CLIs inside in-app PTY sessions. This is how Claude Code, Codex, and Gemini CLI are used with NomiFun: a real pseudo-terminal, the CLI's own auth and OAuth, its own approval prompts, nothing re-implemented. NomiFun injects native capabilities — knowledge search, requirement completion, and lifecycle hooks — into known CLIs through their own native config, so you keep full fidelity. Terminal sessions stay interactive; AutoWork targets canonical AgentSessions instead.

📱 NomiFun Mobile — direct to your Desktop

Product guide: docs/guides/webui-remote-access.md · Portal mirror · App: nomifun-mobile

No social platform or NomiFun cloud relay is required on a LAN. One-tap QR pairing gives the phone a short-lived, one-time login credential and connects it directly to the authenticated listener inside Desktop. Mobile then uses the same sessions, tasks, requirements, companions, models, and tools in real time; Desktop remains the data and execution authority. The phone is a connected, authenticated client, so it does not need a duplicate database or a second copy of your model credentials.

⚙️ Config once, use anywhere

Central hubs for Knowledge, Agent workbench & Skills, MCP, Models, and Open Capabilities — define them once, then select per conversation, terminal, channel, or companion. One source of truth, reused everywhere.

💬 11 IM channels

Product guide: docs/guides/channels.md · Portal mirror

Bind a companion to any of these and drive it from where you already chat:

Telegram · Lark / 飞书 · DingTalk / 钉钉 · WeChat / 微信 · Discord · Slack · Matrix · Mattermost · Twitch · Nostr · QQ Bot


🏗️ Architecture

One React frontend, one Rust backend, two host modes — and the same backend runs in-process in both.

At the product-family level, Desktop is also the hub for Mobile, Xiaozhi, Unified Plugins, and companion IM channels. See docs/architecture/product-ecosystem.md for the full communication, security, and innovation model.

nomifun-desktop nomifun-web
Shell Tauri 2 desktop app Standalone axum server
Backend Embedded in-process, private loopback port Same backend, in-process
Auth Local-trust token injected into the webview Login required by default
Serves Native desktop UI + tray + companion windows API + /ws + built SPA on one port
Computer / browser use ✅ Included ❌ Headless (omitted)

There is no Electron shell, no Node web host, and no prebuilt backend handoff.

Repository map

apps/
  desktop/      Tauri 2 shell and desktop-only commands
  web/          standalone web host for API + SPA
crates/
  agent/        nomi-* agent engine crates: providers, tools, MCP, skills,
                memory, browser/computer use
  backend/      nomifun-* service crates: app composition, auth, database,
                sessions, MCP, knowledge, requirements, terminal, etc.
  shared/       cross-layer crates shared by agent and backend
ui/             React 19 + Vite SPA shared by desktop and web
docs/           technical docs, user/operator guides, architecture notes
packaging/      Linux deployment support for the web host

Start with docs/architecture/overview.md for the full system map. The Cargo workspace is defined in Cargo.toml.


🚀 Getting started

📦 Installers: use GitHub Releases first. Mainland China users can use the Baidu Netdisk mirror (shared as nomifun). You can also install from source or run the server with Docker.

Prerequisites

  • Rust — stable toolchain, edition 2024
  • Bun ≥ 1.3.13
  • Recommended on PATH for full agent tooling: node / npm / npx, git, ripgrep

Desktop app (from source)

git clone https://github.com/nomifun/nomifun-desktop.git
cd nomifun-desktop
bun install

bun run dev      # develop with hot reload
bun run build    # build a desktop bundle for your OS

Web server (self-host)

bun run build:ui && bun run serve:web
# serves API + SPA on http://127.0.0.1:8787 (login required)

Docker (self-host the server)

The official image is published on Docker Hub: nomifun/nomifun-web. The examples below use latest, the stable rolling tag published on Docker Hub. For reproducible deployments, pin an explicit version or image digest.

# Pull and run the official image.
docker run -d \
  --name nomifun-web \
  --restart unless-stopped \
  -p 8787:8787 \
  -v nomifun-data:/data \
  nomifun/nomifun-web:latest
# then open http://<server-ip>:8787 and create the first admin

For unattended or internet-facing deployments, pre-seed the first admin before the port is reachable:

docker run -d \
  --name nomifun-web \
  --restart unless-stopped \
  -p 8787:8787 \
  -v nomifun-data:/data \
  -e NOMIFUN_ADMIN_USERNAME=admin \
  -e NOMIFUN_ADMIN_PASSWORD='change-me-to-something-strong' \
  nomifun/nomifun-web:latest

Compose can use the same official image:

services:
  nomifun:
    image: nomifun/nomifun-web:latest
    restart: unless-stopped
    ports:
      - "8787:8787"
    volumes:
      - nomifun-data:/data
    environment:
      NOMIFUN_ADMIN_USERNAME: admin
      NOMIFUN_ADMIN_PASSWORD: "change-me-to-something-strong"
      # Set to "true" when NomiFun is behind an HTTPS reverse proxy.
      NOMIFUN_HTTPS: "false"

volumes:
  nomifun-data:

If you prefer to build the image locally from this repo:

docker compose up -d --build
# then open http://<server-ip>:8787  —  pair with the bundled Caddyfile for TLS

# Fast path when ui/dist and target/release/nomifun-web are already built:
bun run docker:prebuilt -- --tag nomifun/nomifun-web:latest --build-missing --sudo

See the Portal installation guide and the local web-server deployment contract for details.


🛠️ Development

bun install        # install dependencies (one-time)
bun run dev        # desktop app development (hot reload)
bun run dev:web    # web host + Vite development
bun run build:ui   # build the SPA
bun run check      # frontend typecheck + i18n + theme + script-registry gate
bun run test       # Rust tests (use test:fast for nextest)

Prefer the scripted entry points over plain cargo/vite — they include build-dir pruning and consistency checks. New to the codebase? Read CONTRIBUTING.md, CONTRIBUTING.zh-CN.md, and docs/contributing/development.md.

📦 Desktop packaging

Each OS has its own command, and a package can only be built on its matching OS — macOS bundles must be signed/notarized on macOS, Windows installers built on Windows, Linux packages on Linux. There is no cross-OS build. All artifacts are collected into dist/desktop/.

Common argument shape for all three:

bun run build:<os> [arch ...] [--signed] [-- <args passed straight to `tauri build`>]
  • arch — zero or more architectures. Omit to use the per-OS default below.
  • --signed — sign (and, on macOS, notarize). Requires local signing config; see each OS.
  • -- … — forwards supported arguments to tauri build (e.g. Windows -- --bundles nsis). macOS product packaging fixes the release profile, selected native target and complete App/DMG output; flags that bypass this contract are rejected. For updater builds, layer on the committed overlay as a file path: bun run build:<os> --config apps/desktop/tauri.updater.conf.json — pass the file, not inline JSON, because Windows PowerShell 5.1 strips the quotes from --config '{...}'.

macOS — build:mac (produces a complete .app and .dmg; Apple Silicon arm64 or Intel x64)

Goal Command
Apple Silicon local test package bun run build:mac or bun run build
Developer ID signature + configured notarization bun run build:mac --signed or bun run build:signed
Complete signed updater archive bun run build:updater
Developer ID package and updater archive bun run build:mac --signed --config apps/desktop/tauri.updater.conf.json
Native Intel package and updater archive bun run build:mac --signed intel --config apps/desktop/tauri.updater.conf.json
Complete development .app with embedded Browser bun run build:fast

Both architectures use system WKWebView without bundling or downloading a browser runtime. Arch aliases are arm/aarch64/silicon and intel/x64/x86_64; Universal builds are rejected. Intel packages include the verified ONNX Runtime 1.23.2 and its licenses. Use the native package for your architecture. Cross-compilation is not target-machine acceptance. All macOS product commands share the App assembly and signing pipeline. DMG and updater .app.tar.gz are generated from the final App; updater signing also requires the configured Tauri updater private key.

DMGs use ULMO/LZMA compression by default. To produce a compatibility image with UDZO/zlib level 9, run NOMIFUN_MACOS_DMG_FORMAT=UDZO bun run build:mac (the setting also applies to signed builds). ULMO can be mounted on macOS 10.15+; the existing embedded-browser target remains macOS 14+ for both native architectures. Compression changes neither the App's minimum-system declarations nor its browser runtime. For signed release builds with notarization configured, the final App is signed, notarized and stapled before either distribution container is generated; DMG signing and notarization follow container creation.

bun run dev launches a complete development .app and waits for native browser cleanup before a Rust watch restart. build:fast also creates a complete .app and prints its path. Use the App bundle for product testing, including its identity and system permissions.

For a stable installed development signing identity, explicitly set NOMIFUN_MACOS_DEV_SIGN_IDENTITY="Apple Development: Your Name (TEAMID)" for bun run dev or bun run build:fast. The same identity signs the App, including incremental rebuilds; bundle caches are separate for each configured identity. The scripts do not select or create a certificate. With no setting, builds use ad-hoc signing. WK website data is independent of Safari and the retired browser's profiles; users may need to sign into sites once after migration. Existing AgentSession data and application configuration are preserved. See the macOS signing notes.

Developer ID signing reads apps/desktop/signing/.env.signing (gitignored) and requires an installed APPLE_SIGNING_IDENTITY. Configured notarization applies to the final App and DMG. release:mac publishes arm64 artifacts and reads only that build target when generating its updater entry.

Windows — build:win (produces a single NSIS .exe; default arch: the host's, usually x64)

Goal Command
Current arch bun run build:win
x64 only bun run build:win x64
ARM64 only bun run build:win arm64
Both bun run build:win x64 arm64
Signed (Authenticode) bun run build:win --signed

Arch aliases: x64/x86_64, arm64/aarch64/arm. --signed reads the cert thumbprint from WINDOWS_CERTIFICATE_THUMBPRINT (no “notarization” concept on Windows).

Linux — build:linux (produces .deb / .AppImage / .rpm; default arch: the host's)

Goal Command
Current arch bun run build:linux
x64 only bun run build:linux x64
ARM64 only bun run build:linux arm64
Both bun run build:linux x64 arm64

Arch aliases: x64/x86_64, arm64/aarch64/arm. Linux has no signing/notarization step. ⚠️ Cross-arch (e.g. building arm64 on an x64 host) needs the target's sysroot/toolchain and often fails on the webkit2gtk link — build on the target architecture's machine/container instead.

bun run build builds for the current OS. On macOS it uses the complete native packaging pipeline with arm64 as the default; build:mac intel selects Intel. Windows and Linux retain their existing Tauri build path.

Full script catalog

脚本 说明
开发(热重载)
bun run dev 启动桌面应用开发(tauri dev,热重载)
bun run dev:web 启动 Web 全栈开发(后端 API + 前端 vite)
bun run dev:ui 仅启动前端开发服务器(纯 vite,无后端)
构建(出制品)
bun run build 为当前操作系统打桌面安装包
bun run build:fast 快速构建 debug;macOS 输出原生 WKWebView .app,其余平台输出二进制
bun run build:win 打 Windows 安装包(NSIS),汇总到 dist/desktop/
bun run build:mac 构建 macOS App 和 DMG(默认 arm64,可选 Intel),并汇总到 dist/desktop/
bun run build:linux 打 Linux 安装包(.deb/.AppImage/.rpm),汇总到 dist/desktop/
bun run build:signed 构建完整 macOS App,签名并执行已配置的公证
bun run build:updater 构建自更新包与 .sig;macOS 从最终签名 App 生成更新包
bun run make:latest 扫描本机更新产物,生成/合并自动更新清单 latest.json
bun run release:mac 一键 macOS 发版:自动判定追加/首发;首发用 -Version 打版本号 + -NotesFile/-Notes 建 Release;-DryRun 只预检
bun run release:win 一键 Windows 发版:自动判定追加/首发;首发用 -Version 打版本号 + -NotesFile/-Notes 建 Release;-DryRun 只预检
bun run release:win:signed-rc 串行构建并验收 Windows x64 签名 RC,绑定 immutable release lock 与 Unified Plugin 边界检查
bun run release:linux 一键 Linux 发版:自动判定追加/首发;首发用 -Version 打版本号 + -NotesFile/-Notes 建 Release;-DryRun 只预检
bun run release:cloud 管理 CrabNebula Cloud 发布草稿、分平台上传、发布与更新端点验证
bun run build:ui 前端生产构建 → ui/dist
bun run docker:prebuilt 用已有 ui/dist + nomifun-web release 二进制快速构建 Docker 运行时镜像
运行(组装好的应用)
bun run serve:web 启动 Web 服务器,托管已构建的前端
测试
bun run test 运行全部 Rust 测试(含 doctest)
bun run test:fast 用 nextest 快速跑 Rust 测试(日常)
bun run test:crate 运行单个 Rust crate:bun run test:crate [cargo 参数]
bun run test:core 运行不含 desktop-only feature 的 Rust workspace
bun run test:desktop 运行桌面壳测试,不监听或打包 ui/dist 资源
bun run test:upgrade 运行启动、数据集兼容与升级定向 Rust 测试
bun run test:browser 运行 browser-use 门控的 Rust 测试(browser-platform 全量 + gateway/ai-agent/app 开启 --features browser-use;crate/core 车道会静默跳过这些)
bun run test:ui 运行前端单元测试(bun test,收集 ui/src 下全部 *.test.ts/tsx)
bun run test:plugin-sdk 验证 Unified Plugin SDK 的 KV/DB/Files/Cache/Action/Host/Config 合同
bun run test:nomi-core-live-provider Run the credential-isolated canonical AgentSession selected-model smoke against StepFun Coding Plan.
bun run demo:idmm 用 StepFun Coding Plan 验收智能决策后台触发、规则、旁路、安全停止和恢复,生成隔离 dev 报告
bun run test:agent-reliability-report 验证 Agent 可靠性统计门禁:精确置信区间、样本去重、独立验收与缺失场景检查
bun run test:voice-smoke-runner 测试有界Mobile语音无头观测脚本,不作为真机体验证据
bun run test:mobile-voice-live 显式参数和凭据授权下观测Mobile语音relay媒体与原工作回执,不启动GUI
静态检查
bun run check:windows-installer 校验 Windows NSIS 程序/数据目录分离、锁定模板、第三方归属与安全卸载合同
bun run check:creative-studio-retirement 扫描 tracked 源码,阻止旧创作页面、路由、API、翻译与 Gateway 标记回流
bun run check:creative-studio-retirement:dist 在 UI production build 后扫描 ui/dist,阻止旧创作标记进入发布产物
bun run check:process-runtime-boundary Enforce the supervised process runtime boundary and exact hand-off allowlist.
bun run check:browser-platform-boundary Enforce native conversation Browser ownership, isolated background-browser boundaries, and retirement of legacy browser paths.
bun run check:desktop-ui-boundary 校验 Renderer 仅支持 880x600 及以上桌面窗口,阻止手机分支、低宽度断点和移动浏览器兼容代码回流
bun run check:uarc-boundary 校验单一Runtime、canonical Agent Store、Module/Resource边界;退役生产引用预算为零
bun run check:nomi-core-live-provider Compile the credential-isolated canonical AgentSession live Provider smoke without making a live request.
bun run check:agent-vocabulary Enforce AgentExecution as the only active collaboration aggregate and permit only exact migration fences.
bun run check:agent-reliability 读取独立评测 evidence.json 验证三项 99% 统计下界(--input 路径);样本不足不会通过
bun run check 聚合类型、桌面UI、资源规范、canonical Agent Session、Runtime/Plugin边界及脚本登记检查
bun run typecheck 前端 TypeScript 类型检查(tsc --noEmit)
bun run check:i18n 校验 i18n 类型与 locale 键是否一致
bun run check:theme 校验预设 CSS 主题契约
bun run check:icons 校验 @icon-park/react 导入禁别名/禁命名空间(别名会被图标包装插件改写成非法代码,tsc 抓不到)
bun run check:dead-css 死 CSS 工具类禁令:拦住 <任意颜色前缀>-[rgb(var(--RAMP-N))] / border-border-* / border-b-base / border-b-light / {bg,text,border}-RAMP-N/NN(存量已清零,无基线,出现一处即失败)
bun run check:unified-plugin-boundary 校验 Unified Plugin 单合同、单 Router/Bridge、canonical DB 表与旧 N1/M1/发布聚合物理删除
bun run gate:agent-v2 校验当前canonical Agent合同与生成物完整性
bun run check:agent-session-boundary 校验canonical事件上下文、单native字段、单数据库基线及旧代码和文档物理删除
bun run check:voice-boundary 校验可选Mobile语音的独立合同、核心port和供应商wire隔离
bun run check:voice-contracts 校验独立Voice JSON schema与同级Mobile生成合同,不改主Agent合同
代码生成
bun run gen:i18n 由 locale 重新生成 i18n 类型声明
bun run gen:voice-contracts 生成独立Voice JSON schema与同级Mobile TypeScript合同
维护 / 工具
bun run clean 深度回收构建空间(debug 产物 + flycheck + 旧安装包)
bun run bump 统一改版本号:根 Cargo.toml(真源) + package.json + ui + Cargo.lock,可选 --tag 提交并打 tag
bun run help 打印脚本目录(--check 校验登记 / --readme 生成 README 表)

📖 Documentation

Product walkthroughs, screenshots, onboarding, and end-user troubleshooting are maintained in Portal. This repository keeps source-level architecture, API/wire contracts, deployment, development, security, and release material.


🗺️ Coming soon

NomiFun is pre-1.0 and built part-time, so there's a lot still in flight. On the horizon: prebuilt installers, inbound issue-tracker / requirement sources, more knowledge connectors (Feishu, and beyond), official desktop binaries — plus a few surprises we're genuinely excited about. Stay tuned. ✨


🤝 Contributing & community

NomiFun very much needs your help to grow — code contributions, community building, and evangelism are all hugely welcome. If you have passion for this project, please reach out and build the NomiFun ecosystem with us.


💛 A note from the author

This is a part-time effort with limited bandwidth, and many delightful features are still on the way. If this resonates with you, join in any way you like — a line of code, a suggestion, a reshare all mean a lot.

NomiFun is completely open source, with nothing held back. Individuals and enterprises are free to build on it and use it commercially.

  • Forks & commercial use are welcome. They're also at your own risk — the author and contributors assume no liability for downstream use. Apache-2.0 requires no permission from us.
  • A friendly heads-up is appreciated, not required. If you fork or commercialize NomiFun, we'd love a note — not as a license condition, simply because knowing the project is valued is the kind of recognition that keeps it going.
  • Some features were intentionally left out of the open-source release to keep the local-data promise airtight — without the people and funding to guarantee everyone's data security, removing them was the responsible choice. As time and resources allow, we hope to bring more of them to you.

Thank you for being here. 🙏


🔗 Friendly links

Projects and products we appreciate:

Product What it does
Saytive Be Creative, Be Saytive. A voice input method for creative workers, using strong models and thoughtful product design to sense your work context and deliver fast, accurate, scene-aware transcription.
Fast Search, one tap away. Type, click, and jump straight to search results across RED, Douyin, Meituan, and dozens of mainstream apps. No feed distraction, just search.
AionUi AionUi ships with a complete AI agent engine. Unlike tools that require separate CLI-agent installs, AionUi works the moment you install it.

📬 Contact & community

The following contact information is shared across the NomiFun open-source product family. For reproducible bugs and feature requests, GitHub Issues is the preferred channel.

Channel Where
🌐 Website www.nomifun.com
🐙 Issues github.com/nomifun/nomifun-desktop/issues
📮 Contact www.nomifun.com/contact
📕 小红书 / RED NomiFun
📺 Bilibili NomiFun · demo video
🎵 抖音 / Douyin NomiFun
▶️ YouTube @NomiFun-o2y · demo video
𝕏 X (Twitter) @colir0
🎬 TikTok @colir0luo

Join the chat groups — scan to join:


⚖️ License

Apache-2.0 © 2025–2026 NomiFun.

See NOTICE for third-party attributions.

Built with 💛 for people who want AI on their own terms.

⬆ Back to top

来源:GitHub · github.com