Parlor
The secure digital speakeasy for AI conversation.
Self-hosted ChatGPT-style web UI and agentic CLI that connects to any OpenAI-compatible API.
Install with pip. Run locally. Own your data.
Documentation • Quick Start • Features • Security
Why Parlor?
Step inside. Parlor connects to any OpenAI-compatible endpoint --- your company's internal API, OpenAI, Azure, Ollama, LM Studio, or anything else that speaks the OpenAI protocol. Built to OWASP ASVS L1 standards because your conversations deserve real security, not security theater.
One command. No cloud. No telemetry. No compromise.
Quick Start
pip install parlor
parlor init # Interactive setup wizard
Or create ~/.parlor/config.yaml manually:
ai:
base_url: "https://your-ai-endpoint/v1"
api_key: "your-api-key"
model: "gpt-4"
parlor --test # Verify connection
parlor # Web UI at http://127.0.0.1:8080
parlor chat # Terminal CLI
parlor --version # Show version
Features
Web UI
Full-featured ChatGPT-style interface with conversations, projects, folders, tags, file attachments, MCP tool integration, prompt queuing, command palette, and four built-in themes.
CLI Chat
An agentic terminal REPL with built-in tools (read/write/edit files, bash, glob, grep), MCP integration, skills system, and Rich markdown rendering. Type while the AI works --- messages queue automatically.
parlor chat # Interactive REPL
parlor chat "explain main.py" # One-shot mode
parlor chat -c # Continue last conversation
parlor chat --model gpt-4o "hello" # Override model
Shared Core
Both interfaces share the same agent loop, storage layer, and SQLite database. Conversations created in the CLI show up in the web UI, and vice versa.
Security
| Layer | Implementation |
|---|---|
| Auth | Session tokens, HttpOnly cookies, HMAC-SHA256 |
| CSRF | Per-session double-submit tokens |
| Headers | CSP, X-Frame-Options, HSTS, Referrer-Policy |
| Database | Parameterized queries, column allowlists, path validation |
| Input | DOMPurify, UUID validation, filename sanitization |
| Rate Limiting | 120 req/min per IP |
| CLI Safety | Destructive command confirmation, path blocking |
| MCP Safety | SSRF protection, shell metacharacter rejection |
Full details in SECURITY.md.
Documentation
For complete documentation including configuration, CLI commands, API reference, themes, MCP setup, skills, and development guides, visit parlor.readthedocs.io.
Development
git clone https://github.com/troylar/parlor.git
cd parlor
pip install -e ".[dev]"
pytest tests/ -v
| Backend | Python 3.10+, FastAPI, Uvicorn |
| Frontend | Vanilla JS, marked.js, highlight.js, KaTeX |
| CLI | Rich, prompt-toolkit, tiktoken |
| Database | SQLite with FTS5, WAL journaling |
| AI | OpenAI Python SDK (async streaming) |
| MCP | Model Context Protocol SDK (stdio + SSE) |
MIT License
Built for people who care about their conversations.
parlor.readthedocs.io
Metadata
Release files for parlor 0.15.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| parlor-0.15.1.tar.gz | 703.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| parlor-0.15.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.4 MB
Release files / parlor-0.15.1.tar.gz
| Download URL | parlor-0.15.1.tar.gz |
|---|---|
| Size | 703.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
01cd1a7f31948ee38eb3928381992bc976294dfcd67cea40202e374961255842
|
|
BLAKE2b-256 checksum How to use checksums |
18efc63237a160006030aeff71b8ce1da748d15283f6d8b9145e6474db22f6cf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Release files / parlor-0.15.1-py3-none-any.whl
| Download URL | parlor-0.15.1-py3-none-any.whl |
|---|---|
| Size | 746.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8d8a04c1b2b540a69bb23a3a8c54ef59177243f92ba18f5947a1d96c293409e4
|
|
BLAKE2b-256 checksum How to use checksums |
cc9065ceff06a657b8c5acab26c98c57d926488e2db55e2f99a4486196fdfaff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|