Skip to content

Repository files navigation

Tailor

The AI assistant that fits you.

Build your own AI workspace with plugins, any model, and complete control.

Getting Started · Plugins · Architecture · Contributing

🚧 Work in Progress: Tailor is in active, early-stage development. The codebase is changing rapidly and feature implementation is ongoing. We welcome your ideas, feedback, and pull requests to help shape the future of modular AI!

🧠 What is Tailor?

Tailor is an open-source desktop framework for building personal AI assistants. Instead of one-size-fits-all chatbots, Tailor lets you assemble a workspace from plugins, models, and tools — all running locally on your machine.

Core ideas:

  • Vaults — Each workspace is a self-contained folder. Open multiple vaults, each with its own plugins, models, and conversations. Nothing bleeds between them.
  • Plugins — Small Python scripts that extend everything. Add UI panels, inject context, call APIs, process responses, or give the LLM new tools. The plugin system is the product.
  • Any model — Use OpenAI, Gemini, Claude, Ollama, or any LiteLLM-supported provider. Assign different models to different tasks (thinking, fast, vision, code, embedding).
  • Local-first — Your data stays on your machine. No cloud accounts required. Configs are TOML, settings are JSON — everything is readable and portable.

✨ Features

🔌 Plugin Ecosystem

Four types of plugins that can be mixed freely:

  • User-callable — buttons in toolbars, sidebars or golden-layout panels
  • LLM-callable — tools the AI can use autonomously
  • Pipeline — automatic hooks on every message
  • Hybrid — any combination of the above

🤖 Model Agnostic

Works with every major LLM provider:

  • OpenAI (GPT-4o, GPT-4, GPT-3.5)
  • Google (Gemini Pro, Gemini Flash)
  • Anthropic (Claude 3.5, Claude 3)
  • Ollama (Llama, Mistral, any local model)
  • Any LiteLLM-compatible provider

🏗️ Vault Isolation

Each vault runs its own process:

  • Separate plugins, settings, and state
  • Crash-contained — one vault can't affect another
  • Portable — share vault folders with anyone
  • Multi-window — use different vaults side by side

📊 Pipeline Visualization

See your AI's brain in real time:

  • LangGraph pipeline rendered as interactive Mermaid diagrams
  • View registered tools and their metadata
  • Understand exactly how your assistant processes each message

🚀 Getting Started

Prerequisites

ToolPurposeInstall
PixiManages Python, Node.js, and Rust environmentsprefix.dev
RustRequired for the Tauri desktop shellrustup.rs

Install & Run

# Clone
git clone https://github.com/AGS-Lab/tailor.git
cd tailor
# Install everything (Python, Node.js, Rust deps — all automatic)
pixi install
# Launch
pixi run dev

Open Your First Vault

  1. Click Open Vault in the launcher
  2. Select the included example-vault/ folder
  3. Start chatting — plugins load automatically

That's it. Your AI workspace is running. 🎉


🧩 Plugins

Plugins are the heart of Tailor. Everything beyond the core chat is a plugin.

Included Plugins

PluginTypeWhat it does
SummarizerUser-callableOne-click TL;DR of long AI responses
Prompt RefinerHybridRefines your prompts before sending (manual or auto)
Smart ContextHybridTopic extraction + embedding-based context filtering
ExplorerUser-callableChatGPT-style chat history sidebar
MemoryPipelineAuto-saves conversations to disk
Chat BranchesUser-callableFork conversations to explore different paths

Write Your Own (It's Simple)

# plugins/greeter/main.pyfromsidecar.api.plugin_baseimportPluginBaseclassPlugin(PluginBase):
"""A greeting plugin in 15 lines."""defregister_commands(self):
self.brain.register_command("greeter.hello", self.hello, self.name)
asyncdefhello(self, name="World", **kwargs):
self.notify(f"Hello, {name}! 👋", severity="success")
return {"status": "success", "message": f"Hello, {name}!"}

Make Tools the LLM Can Call

fromsidecar.decoratorsimporttool@tool(name="search_web", category="information",description="Search the web for current information")defsearch_web(query: str) ->str:
"""The LLM will call this autonomously when it needs web data."""returnfetch_results(query)

📖 Full guide:Plugin Development Guide · Plugin Architecture


🏛️ Architecture

Three processes, communicating over WebSocket (JSON-RPC 2.0):

┌─────────────────────────────────────────────────────────┐
│ Frontend (Vite/JS) │
│ Chat UI · Panels · Toolbars · Plugin UIs │
├─────────────────────────────────────────────────────────┤
│ Rust/Tauri Backend │
│ Window management · Process orchestration │
├─────────────────────────────────────────────────────────┤
│ Python Sidecar (per vault) │
│ Plugins · LLM Pipeline · Tool Registry · Commands │
└─────────────────────────────────────────────────────────┘
↕ WebSocket (JSON-RPC 2.0) ↕

Why this design?

  • Vault isolation: Each vault gets its own Python process. No shared state. Crash containment.
  • Language best-of-breed: Rust for performance + system access, Python for AI/ML ecosystem, JS for UI.
  • Plugin safety: Plugins run in their own process, can't crash the desktop shell.

📖 Deep dive:Architecture · Vision


🗂️ Project Structure

tailor/
├── src/ Frontend (Vanilla JS + Vite)
│ ├── vault/ Vault window UI (chat, layout, panels)
│ ├── pages/ Dashboard pages (settings, themes, vault config)
│ └── services/ Tauri IPC wrappers
├── src-tauri/src/ Rust backend
│ ├── sidecar_manager.rs Python process lifecycle
│ ├── window_manager.rs Window tracking
│ ├── ipc_router.rs Tauri command handlers
│ └── event_bus.rs Event routing
├── sidecar/ Python sidecar
│ ├── vault_brain.py Singleton orchestrator
│ ├── pipeline/ LangGraph pipeline + Tool Registry
│ ├── api/ Plugin base class
│ ├── services/ LLM, keyring, memory
│ └── decorators.py @command, @tool, @on_event
├── example-vault/ Working example with 9 plugins
│ ├── .vault.toml Vault configuration
│ └── plugins/ Plugin collection
└── docs/ Documentation
├── system/ Architecture, vision, plugin taxonomy
└── plans/ Implementation plans and TODOs

🧪 Development

pixi run dev # Start dev server + Tauri window
pixi run test# Run Python tests
pixi run test-rust # Run Rust tests
pixi run lint # Check Python with ruff
pixi run format # Format Python with ruff
pixi run build # Production build

Run a single test:

pixi run pytest sidecar/tests/test_vault_brain.py::test_function_name

📚 Documentation

DocumentWhat it covers
Plugin GuideBuilding plugins — commands, tools, lifecycle, UI
Plugin ArchitecturePlugin type taxonomy, UI locations, hybrid patterns
ArchitectureFull technical architecture of all three layers
VisionCore principles, settled decisions, project direction
Plugin CommandsCommand registry pattern and examples
FAQCommon questions answered simply
Setup GuideDetailed installation instructions
UI Style GuideDesign guidelines for plugin UIs
ContributingHow to contribute

🤝 Contributing

We are actively looking for contributors! Whether you want to build a new plugin, fix a bug, or improve the core framework, Tailor is a great place to hack on AI tooling.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feat/my-feature)
  3. Write your code and verify with pixi run test
  4. Submit a Pull Request

Not sure where to start? Check the Issue tracker or read our Contributing Guide.


⚖️ License

MIT — see LICENSE for details.



TailorYour AI, your rules.

Built with Tauri · LangGraph · LiteLLM · Pixi

About

A modular AI framework that lets you stitch together models and tools into an assistant that fits you perfectly.

Topics

Resources

Contributing

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages