Metadata-Version: 2.4
Name: familiar-agent
Version: 1.15.23
Summary: Self-Hosted AI Companion Platform
Project-URL: Homepage, https://github.com/omegcrash/familiar
Project-URL: Bug Tracker, https://github.com/omegcrash/familiar/issues
Author-email: George Scott Foley <Georgescottfoley@proton.me>
License: MIT
License-File: LICENSE
Keywords: ai,assistant,healthcare,llm,nonprofit,privacy
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.10
Requires-Dist: aiofiles>=23.0
Requires-Dist: certifi>=2024.7.4
Requires-Dist: flask-cors>=4.0
Requires-Dist: flask>=3.1.3
Requires-Dist: httpx>=0.27
Requires-Dist: idna>=3.7
Requires-Dist: pydantic>=2.0
Requires-Dist: python-dotenv>=1.0
Requires-Dist: pyyaml>=6.0
Requires-Dist: urllib3>=2.6.3
Requires-Dist: websockets>=12.0
Requires-Dist: werkzeug>=3.1.6
Provides-Extra: api-integrations
Provides-Extra: bluesky
Requires-Dist: atproto>=0.0.55; extra == 'bluesky'
Provides-Extra: chain
Requires-Dist: web3>=6.0; extra == 'chain'
Provides-Extra: dev
Requires-Dist: mypy>=1.8; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest-cov>=4.1; extra == 'dev'
Requires-Dist: pytest>=7.4; extra == 'dev'
Requires-Dist: ruff>=0.3; extra == 'dev'
Provides-Extra: discord
Requires-Dist: discord-py>=2.3.0; extra == 'discord'
Provides-Extra: docs
Requires-Dist: matplotlib>=3.8; extra == 'docs'
Requires-Dist: openpyxl>=3.1; extra == 'docs'
Requires-Dist: pillow>=10.3.0; extra == 'docs'
Requires-Dist: pymupdf>=1.23; extra == 'docs'
Requires-Dist: python-docx>=1.0; extra == 'docs'
Requires-Dist: python-pptx>=0.6.23; extra == 'docs'
Requires-Dist: weasyprint>=60.0; extra == 'docs'
Provides-Extra: email
Requires-Dist: aiosmtpd>=1.4.4; extra == 'email'
Provides-Extra: encryption
Requires-Dist: cryptography>=46.0.5; extra == 'encryption'
Requires-Dist: pynacl>=1.6.2; extra == 'encryption'
Provides-Extra: full
Requires-Dist: aiosmtpd>=1.4.4; extra == 'full'
Requires-Dist: anthropic>=0.40; extra == 'full'
Requires-Dist: atproto>=0.0.55; extra == 'full'
Requires-Dist: beautifulsoup4>=4.12; extra == 'full'
Requires-Dist: caldav>=1.3; extra == 'full'
Requires-Dist: cryptography>=46.0.5; extra == 'full'
Requires-Dist: discord-py>=2.3.0; extra == 'full'
Requires-Dist: duckduckgo-search>=8.0; extra == 'full'
Requires-Dist: edge-tts>=6.1; extra == 'full'
Requires-Dist: faster-whisper>=1.0; extra == 'full'
Requires-Dist: flask-limiter>=3.5; extra == 'full'
Requires-Dist: flask-socketio>=5.3; extra == 'full'
Requires-Dist: google-api-python-client>=2.100; extra == 'full'
Requires-Dist: google-auth-httplib2>=0.2; extra == 'full'
Requires-Dist: google-auth-oauthlib>=1.0; extra == 'full'
Requires-Dist: google-genai>=1.0; extra == 'full'
Requires-Dist: gtts>=2.4; extra == 'full'
Requires-Dist: mastodon-py>=1.8; extra == 'full'
Requires-Dist: matplotlib>=3.8; extra == 'full'
Requires-Dist: matrix-nio>=0.24; extra == 'full'
Requires-Dist: openai-whisper>=20231117; extra == 'full'
Requires-Dist: openai>=1.0; extra == 'full'
Requires-Dist: openpyxl>=3.1; extra == 'full'
Requires-Dist: pillow>=10.3.0; extra == 'full'
Requires-Dist: playwright>=1.40; extra == 'full'
Requires-Dist: presidio-analyzer>=2.2; extra == 'full'
Requires-Dist: presidio-anonymizer>=2.2; extra == 'full'
Requires-Dist: pygithub>=2.0; extra == 'full'
Requires-Dist: pymupdf>=1.23; extra == 'full'
Requires-Dist: pynacl>=1.6.2; extra == 'full'
Requires-Dist: python-docx>=1.0; extra == 'full'
Requires-Dist: python-pptx>=0.6.23; extra == 'full'
Requires-Dist: python-socks[asyncio]>=2.4; extra == 'full'
Requires-Dist: python-telegram-bot>=20.0; extra == 'full'
Requires-Dist: pyttsx3>=2.90; extra == 'full'
Requires-Dist: redis>=4.0.0; extra == 'full'
Requires-Dist: requests>=2.32.4; extra == 'full'
Requires-Dist: slack-sdk>=3.0; extra == 'full'
Requires-Dist: spacy>=3.7; extra == 'full'
Requires-Dist: speechrecognition>=3.10; extra == 'full'
Requires-Dist: stem>=1.8.1; extra == 'full'
Requires-Dist: textual>=0.70; extra == 'full'
Requires-Dist: vobject>=0.9; extra == 'full'
Requires-Dist: weasyprint>=60.0; extra == 'full'
Requires-Dist: websockets>=12.0; extra == 'full'
Requires-Dist: zeroconf>=0.115; extra == 'full'
Provides-Extra: gemini
Requires-Dist: google-genai>=1.0; extra == 'gemini'
Provides-Extra: github
Requires-Dist: pygithub>=2.0; extra == 'github'
Provides-Extra: google
Requires-Dist: google-api-python-client>=2.100; extra == 'google'
Requires-Dist: google-auth-httplib2>=0.2; extra == 'google'
Requires-Dist: google-auth-oauthlib>=1.0; extra == 'google'
Provides-Extra: healthcare
Requires-Dist: presidio-analyzer>=2.2; extra == 'healthcare'
Requires-Dist: presidio-anonymizer>=2.2; extra == 'healthcare'
Requires-Dist: spacy>=3.7; extra == 'healthcare'
Provides-Extra: llm
Requires-Dist: anthropic>=0.40; extra == 'llm'
Requires-Dist: openai>=1.0; extra == 'llm'
Provides-Extra: mastodon
Requires-Dist: mastodon-py>=1.8; extra == 'mastodon'
Provides-Extra: matrix
Requires-Dist: matrix-nio>=0.24; extra == 'matrix'
Provides-Extra: mesh
Requires-Dist: pynacl>=1.6.2; extra == 'mesh'
Requires-Dist: python-socks[asyncio]>=2.4; extra == 'mesh'
Requires-Dist: stem>=1.8.1; extra == 'mesh'
Requires-Dist: websockets>=12.0; extra == 'mesh'
Requires-Dist: zeroconf>=0.115; extra == 'mesh'
Provides-Extra: nextcloud
Requires-Dist: caldav>=1.3; extra == 'nextcloud'
Requires-Dist: vobject>=0.9; extra == 'nextcloud'
Provides-Extra: redis
Requires-Dist: redis>=4.0.0; extra == 'redis'
Provides-Extra: self-hosted
Requires-Dist: caldav>=1.3; extra == 'self-hosted'
Requires-Dist: vobject>=0.9; extra == 'self-hosted'
Provides-Extra: slack
Requires-Dist: slack-sdk>=3.0; extra == 'slack'
Provides-Extra: telegram
Requires-Dist: python-telegram-bot>=20.0; extra == 'telegram'
Provides-Extra: training
Requires-Dist: accelerate>=0.30; extra == 'training'
Requires-Dist: bitsandbytes>=0.43; extra == 'training'
Requires-Dist: peft>=0.10; extra == 'training'
Requires-Dist: transformers>=4.40; extra == 'training'
Provides-Extra: tui
Requires-Dist: textual>=0.70; extra == 'tui'
Provides-Extra: voice
Requires-Dist: edge-tts>=6.1; extra == 'voice'
Requires-Dist: faster-whisper>=1.0; extra == 'voice'
Requires-Dist: gtts>=2.4; extra == 'voice'
Requires-Dist: openai-whisper>=20231117; extra == 'voice'
Requires-Dist: pyttsx3>=2.90; extra == 'voice'
Requires-Dist: speechrecognition>=3.10; extra == 'voice'
Provides-Extra: web
Requires-Dist: beautifulsoup4>=4.12; extra == 'web'
Requires-Dist: duckduckgo-search>=8.0; extra == 'web'
Requires-Dist: flask-limiter>=3.5; extra == 'web'
Requires-Dist: flask-socketio>=5.3; extra == 'web'
Requires-Dist: playwright>=1.40; extra == 'web'
Requires-Dist: requests>=2.32.4; extra == 'web'
Description-Content-Type: text/markdown

# Familiar

**Self-hosted AI agent with Signal-grade encryption**

![Version](https://img.shields.io/badge/version-1.12.1-purple) ![Python](https://img.shields.io/badge/python-3.10+-green) ![License](https://img.shields.io/badge/license-MIT-orange)

---

## Quick Start

### Install from PyPI

```bash
pip install familiar-agent[llm]
export ANTHROPIC_API_KEY="sk-ant-..."   # or OPENAI_API_KEY
python -m familiar
```

### Run from source

```bash
git clone https://github.com/omegcrash/familiar.git
cd familiar/familiar
./run.sh
```

`run.sh` auto-detects your setup. If you have Ollama installed, it uses local AI (free, private). If you set an API key, it uses Claude or GPT instead.

**That's it.** No Docker, no databases, no config files needed.

### Setup Wizard

For a guided setup experience, use the onboarding wizard:

```bash
python -m familiar --onboard          # CLI wizard (step-by-step)
python -m familiar --onboard-tui      # Rich terminal UI (keyboard-navigable)
python -m familiar --reconfigure      # Re-run setup to change settings
```

The wizard auto-detects your LLM providers (Anthropic, OpenAI, Gemini, Ollama), lets you configure channels (Telegram, Discord, Matrix, WhatsApp, Signal, iMessage, Teams, CLI), sets up encryption, and sends a test message — all in under 5 minutes. A web-based version is also available at `/onboard` on the dashboard.

See [docs/CHANNELS.md](familiar/docs/CHANNELS.md) for per-channel setup instructions.

To run the web wizard from another device on your LAN (e.g. setting up a Raspberry Pi from your laptop):

```bash
FAMILIAR_ONBOARD_LAN=1 python -m familiar --dashboard
# Then open http://<pi-ip>:5000/onboard from your laptop
```

---

## What Is Familiar?

A self-hosted AI agent that runs on your machine — from a Raspberry Pi to a workstation. Talk to it through CLI, Telegram, Discord, Matrix, Teams, or the web dashboard. It remembers context, executes tools, manages your calendar, reads your email, controls GPIO pins, and browses the web.

Everything is encrypted locally. Your conversations never leave your hardware unless you choose a cloud LLM provider.

### Features

- **Multi-provider LLM** — Claude, GPT, or local models via Ollama (llama3.2, deepseek-r1, qwen2.5, mistral, gemma3, phi3)
- **50+ skills** — email, calendar, browser, knowledge base, tasks, GPIO, voice, documents, Nextcloud, Gitea, Jellyfin, and more
- **Signal-grade encryption** — Double Ratchet secure transport, sessions and memory encrypted at rest
- **Multi-channel** — CLI, Telegram, Discord, Matrix, Teams, web dashboard, Signal, iMessage, WhatsApp, SMS
- **Raspberry Pi optimized** — runs on 4GB Pi with local Ollama models
- **Multi-device mesh** — connect multiple Familiar instances with encrypted peer-to-peer networking
- **HIPAA-ready** — compliance mode with audit logging and PHI detection
- **Task hints & eval metrics** — context-aware task suggestions, CI evaluation with cost tracking
- **Self-hosted email server** — built-in SMTP/IMAP server for fully self-hosted email

---

## Advanced Installation

For running as a system daemon, Pi optimization, or full dependency install:

```bash
# Full install with all extras
pip install familiar-agent[full]

# Pi-specific with Ollama optimization
./familiar/scripts/install-pi.sh --with-ollama

# Nonprofit preset (email, calendar, tasks)
./familiar/scripts/install-pi.sh --nonprofit
```

See [docs/INSTALL.md](familiar/docs/INSTALL.md) for detailed options.

---

## Configuration

Copy and edit the sample config:

```bash
cp config.sample.yaml ~/.familiar/config.yaml
```

Key settings:
```yaml
llm:
  default_provider: anthropic     # or openai, ollama
  anthropic_model: claude-sonnet-4-6
  ollama_model: llama3.2

agent:
  name: Familiar
  memory_enabled: true
  skills_enabled: true

security:
  encrypt_sessions: true
  encrypt_memory: true
```

---

## Project Structure

```
familiar/
├── pyproject.toml           # Package config (pip install -e .)
├── familiar/
│   ├── run.sh               # Quick start script
│   ├── __main__.py          # CLI entry point
│   ├── core/                # Agent, providers, memory, mesh, secure transport
│   ├── channels/            # CLI, Telegram, Discord, Matrix, Teams, etc.
│   ├── skills/              # 50+ built-in skills
│   ├── dashboard/           # Web dashboard
│   ├── admin/               # Admin panel
│   ├── onboard/             # Google Workspace setup wizard
│   ├── docs/                # Documentation
│   └── scripts/             # Install scripts + dev tools
```

---

## License

MIT — Copyright (c) 2026 George Scott Foley

See [LICENSE](LICENSE) for full text.
