Personal Intelligent Assistant
An AI-powered Windows desktop assistant that optimizes your text
and chats with you — only one hotkey away.
Pia sits in your system tray and activates instantly with a global hotkey. Select text in any app, press Ctrl+Alt+O, and Pia optimizes it on the spot. Need more? Switch to Assistant mode for a full AI chat.
| Mode | What it does | Default Hotkey |
|---|---|---|
| Optimize | Transform text using templates — make an email professional, rewrite for clarity, adjust tone | Ctrl+Alt+O |
| Assistant | Chat with an AI that remembers your preferences, manages todos and reminders, and stores knowledge in a personal memory | Ctrl+Alt+P |
In Assistant mode, Pia has access to built-in tools that it uses automatically during conversation:
| Tool Group | Capabilities |
|---|---|
| Memory | Store and recall personal facts, contacts, preferences, and notes — with semantic search via embeddings |
| Todos | Create tasks with priorities (Low/Medium/High), due dates, and notes — query, update, complete, or delete them |
| Reminders | Schedule one-time or recurring reminders (Daily, Weekly, Monthly, Yearly) with natural language parsing — background notifications keep you on track |
| Files | Read, summarize, update and delete text files — only inside a sandbox folder you configure |
| Git | Local git operations on the working directory (status, log, diff, branch, show, init, add, commit, switch, restore, stash) — no network operations |
| Screen | Look at one window or one display as a picture, on request |
| Vault ingest | Compile raw documents from the vault's sources folder into recallable topic pages |
| Chat history | Search and read your past conversations with the assistant |
| Routines | Schedule recurring jobs whose answers arrive as chats |
| Assignments | Follow background work the Pia server runs remotely on records you select |
| MCP plugins | Any tool exposed by a Model Context Protocol server you connect |
Each group can be switched off entirely in Settings.
Looking something up runs as part of the conversation. Anything that changes something — a file, a commit, a reminder — and anything that captures your screen passes a permission gate first. What the gate does depends on where the request came from:
| Situation | Behaviour |
|---|---|
| You are in the chat | An action card shows what is about to happen. Allow once, always allow, or decline |
| Voice mode | Writes are refused — there is no card to answer, so Pia tells you what to do instead |
| Unattended run (scheduled or background) | Writes are refused unless you granted that tool beforehand — nobody is watching |
"Always allow" is a standing grant you can withdraw in Settings at any time. Screen capture and background assignments are never covered by a general grant — they always need one of their own. Every decision is recorded together with the permission that allowed it, so a run's timeline shows exactly why each action was able to run.
One exception worth naming: vault ingest runs inline and shows no card. It writes only inside your
vault's own memory folder, turning documents you put in sources into topic pages.
git clone https://github.com/Pia-Ai-dev/Pia.Wpf.git
cd Pia.Wpf
dotnet build
dotnet run --project src/Pia.Wpf/Pia.Wpf.csproj
On first run, a setup wizard walks you through everything:
All fields are optional — you can skip the entire wizard and configure everything later in Settings.
Ctrl+Alt+P — Pia appears, ready for inputThat's it. Pia stays in your system tray, ready whenever you need it.
Pia works with multiple AI backends — pick what suits you:
| Provider | Setup |
|---|---|
| Pia Cloud | Built-in first-party provider — no configuration required |
| OpenAI | Paste your API key in Settings (custom endpoint/model optional) |
| Azure OpenAI | Enter endpoint, deployment name, and API key |
| OpenRouter | API key (defaults to https://openrouter.ai/api/v1) |
| Anthropic | Paste your API key in Settings |
| Mistral | API key (defaults to https://api.mistral.ai/v1) |
| Ollama | Point to your local Ollama instance — no API key needed, fully offline |
| OpenAI-compatible | Any OpenAI-compatible endpoint (LM Studio, vLLM, and similar) |
The provider edit dialog can auto-fetch available models from any configured endpoint. API keys are encrypted locally using Windows DPAPI — they never leave your machine unencrypted.
Pia.Wpf.slnx
├── src/
│ ├── Pia.Wpf/ # WPF desktop client
│ │ ├── Behaviors/ # XAML attached behaviors (autocomplete, drag/drop, kanban)
│ │ ├── Controls/ # Custom WPF controls
│ │ ├── Converters/ # Value converters
│ │ ├── Helpers/ # Utility helpers
│ │ ├── Infrastructure/ # DPAPI, SQLite, P/Invoke
│ │ ├── Localization/ # i18n resources
│ │ ├── Models/ # Data models and enums
│ │ ├── Navigation/ # View navigation
│ │ ├── Services/ # Application services (incl. Plugins/ for MCP)
│ │ ├── ViewModels/ # MVVM ViewModels
│ │ └── Views/ # XAML views and dialogs
│ └── Pia.Shared/ # Shared DTOs for sync
└── tests/
└── Pia.Wpf.Tests/ # Unit tests
| Layer | Technology |
|---|---|
| UI Framework | WPF + WPF-UI 4.2.0 (Fluent Design) |
| Runtime | .NET 10.0 |
| MVVM | CommunityToolkit.Mvvm |
| AI Integration | Azure.AI.OpenAI, Microsoft.Extensions.AI |
| MCP | ModelContextProtocol |
| Speech-to-Text | Whisper.NET (local, offline) |
| Text-to-Speech | PiperSharp (local, offline) |
| Audio | NAudio |
| Database | Microsoft.Data.Sqlite |
| Encryption | Windows DPAPI (API keys), E2EE for sync |
| Markdown | MdXaml (NuGet) |
| Installer | Velopack |
| Location | Contents |
|---|---|
%AppData%/Pia/ | settings.json, templates.json, providers.json |
%LocalAppData%/Pia/ | history.db (SQLite), Whisper models |
Your data is stored locally. Nothing in the tables above is uploaded on its own, and Pia builds
no analytics or usage profile. The only call it makes without being asked is the update check; every
external host the app can contact is listed in docs/external_endpoints/. Two things do leave the
machine on purpose, and both are your choice:
Rating an answer sends that one message to the Pia server, and only when you press the button; the answer text is included only if you tick the box. The rating buttons appear only for Pia Cloud answers — when you use your own provider key there is nobody for a report to reach, so Pia does not show them.
# Debug build
dotnet build
# Release build
dotnet build -c Release
# Run
dotnet run --project src/Pia.Wpf/Pia.Wpf.csproj
# Clean
dotnet clean
main:
git checkout main
git checkout -b feature/your-feature-name
.editorconfigmain| Branch | Purpose |
|---|---|
main | Production releases |
feature/* | Feature development |
var for apparent types, expression-bodied members preferred_camelCase for private fieldsCopyright © 2026 Pia-Ai-dev
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License, version 3, as published by the Free Software Foundation.
It is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
LGPL-3.0 incorporates the terms of the GNU General Public License, version 3: LICENSE
holds the former and GPL-3.0.txt the latter.
Licences for the models and components Pia downloads at runtime — speech models and
text-to-speech voices among them — are listed in
THIRD-PARTY-NOTICES.md.
Personal Intelligent Assistant
An AI-powered Windows desktop assistant that optimizes your text
and chats with you — only one hotkey away.
Pia sits in your system tray and activates instantly with a global hotkey. Select text in any app, press Ctrl+Alt+O, and Pia optimizes it on the spot. Need more? Switch to Assistant mode for a full AI chat.
| Mode | What it does | Default Hotkey |
|---|---|---|
| Optimize | Transform text using templates — make an email professional, rewrite for clarity, adjust tone | Ctrl+Alt+O |
| Assistant | Chat with an AI that remembers your preferences, manages todos and reminders, and stores knowledge in a personal memory | Ctrl+Alt+P |
In Assistant mode, Pia has access to built-in tools that it uses automatically during conversation:
| Tool Group | Capabilities |
|---|---|
| Memory | Store and recall personal facts, contacts, preferences, and notes — with semantic search via embeddings |
| Todos | Create tasks with priorities (Low/Medium/High), due dates, and notes — query, update, complete, or delete them |
| Reminders | Schedule one-time or recurring reminders (Daily, Weekly, Monthly, Yearly) with natural language parsing — background notifications keep you on track |
| Files | Read, summarize, update and delete text files — only inside a sandbox folder you configure |
| Git | Local git operations on the working directory (status, log, diff, branch, show, init, add, commit, switch, restore, stash) — no network operations |
| Screen | Look at one window or one display as a picture, on request |
| Vault ingest | Compile raw documents from the vault's sources folder into recallable topic pages |
| Chat history | Search and read your past conversations with the assistant |
| Routines | Schedule recurring jobs whose answers arrive as chats |
| Assignments | Follow background work the Pia server runs remotely on records you select |
| MCP plugins | Any tool exposed by a Model Context Protocol server you connect |
Each group can be switched off entirely in Settings.
Looking something up runs as part of the conversation. Anything that changes something — a file, a commit, a reminder — and anything that captures your screen passes a permission gate first. What the gate does depends on where the request came from:
| Situation | Behaviour |
|---|---|
| You are in the chat | An action card shows what is about to happen. Allow once, always allow, or decline |
| Voice mode | Writes are refused — there is no card to answer, so Pia tells you what to do instead |
| Unattended run (scheduled or background) | Writes are refused unless you granted that tool beforehand — nobody is watching |
"Always allow" is a standing grant you can withdraw in Settings at any time. Screen capture and background assignments are never covered by a general grant — they always need one of their own. Every decision is recorded together with the permission that allowed it, so a run's timeline shows exactly why each action was able to run.
One exception worth naming: vault ingest runs inline and shows no card. It writes only inside your
vault's own memory folder, turning documents you put in sources into topic pages.
git clone https://github.com/Pia-Ai-dev/Pia.Wpf.git
cd Pia.Wpf
dotnet build
dotnet run --project src/Pia.Wpf/Pia.Wpf.csproj
On first run, a setup wizard walks you through everything:
All fields are optional — you can skip the entire wizard and configure everything later in Settings.
Ctrl+Alt+P — Pia appears, ready for inputThat's it. Pia stays in your system tray, ready whenever you need it.
Pia works with multiple AI backends — pick what suits you:
| Provider | Setup |
|---|---|
| Pia Cloud | Built-in first-party provider — no configuration required |
| OpenAI | Paste your API key in Settings (custom endpoint/model optional) |
| Azure OpenAI | Enter endpoint, deployment name, and API key |
| OpenRouter | API key (defaults to https://openrouter.ai/api/v1) |
| Anthropic | Paste your API key in Settings |
| Mistral | API key (defaults to https://api.mistral.ai/v1) |
| Ollama | Point to your local Ollama instance — no API key needed, fully offline |
| OpenAI-compatible | Any OpenAI-compatible endpoint (LM Studio, vLLM, and similar) |
The provider edit dialog can auto-fetch available models from any configured endpoint. API keys are encrypted locally using Windows DPAPI — they never leave your machine unencrypted.
Pia.Wpf.slnx
├── src/
│ ├── Pia.Wpf/ # WPF desktop client
│ │ ├── Behaviors/ # XAML attached behaviors (autocomplete, drag/drop, kanban)
│ │ ├── Controls/ # Custom WPF controls
│ │ ├── Converters/ # Value converters
│ │ ├── Helpers/ # Utility helpers
│ │ ├── Infrastructure/ # DPAPI, SQLite, P/Invoke
│ │ ├── Localization/ # i18n resources
│ │ ├── Models/ # Data models and enums
│ │ ├── Navigation/ # View navigation
│ │ ├── Services/ # Application services (incl. Plugins/ for MCP)
│ │ ├── ViewModels/ # MVVM ViewModels
│ │ └── Views/ # XAML views and dialogs
│ └── Pia.Shared/ # Shared DTOs for sync
└── tests/
└── Pia.Wpf.Tests/ # Unit tests
| Layer | Technology |
|---|---|
| UI Framework | WPF + WPF-UI 4.2.0 (Fluent Design) |
| Runtime | .NET 10.0 |
| MVVM | CommunityToolkit.Mvvm |
| AI Integration | Azure.AI.OpenAI, Microsoft.Extensions.AI |
| MCP | ModelContextProtocol |
| Speech-to-Text | Whisper.NET (local, offline) |
| Text-to-Speech | PiperSharp (local, offline) |
| Audio | NAudio |
| Database | Microsoft.Data.Sqlite |
| Encryption | Windows DPAPI (API keys), E2EE for sync |
| Markdown | MdXaml (NuGet) |
| Installer | Velopack |
| Location | Contents |
|---|---|
%AppData%/Pia/ | settings.json, templates.json, providers.json |
%LocalAppData%/Pia/ | history.db (SQLite), Whisper models |
Your data is stored locally. Nothing in the tables above is uploaded on its own, and Pia builds
no analytics or usage profile. The only call it makes without being asked is the update check; every
external host the app can contact is listed in docs/external_endpoints/. Two things do leave the
machine on purpose, and both are your choice:
Rating an answer sends that one message to the Pia server, and only when you press the button; the answer text is included only if you tick the box. The rating buttons appear only for Pia Cloud answers — when you use your own provider key there is nobody for a report to reach, so Pia does not show them.
# Debug build
dotnet build
# Release build
dotnet build -c Release
# Run
dotnet run --project src/Pia.Wpf/Pia.Wpf.csproj
# Clean
dotnet clean
main:
git checkout main
git checkout -b feature/your-feature-name
.editorconfigmain| Branch | Purpose |
|---|---|
main | Production releases |
feature/* | Feature development |
var for apparent types, expression-bodied members preferred_camelCase for private fieldsCopyright © 2026 Pia-Ai-dev
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License, version 3, as published by the Free Software Foundation.
It is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
LGPL-3.0 incorporates the terms of the GNU General Public License, version 3: LICENSE
holds the former and GPL-3.0.txt the latter.
Licences for the models and components Pia downloads at runtime — speech models and
text-to-speech voices among them — are listed in
THIRD-PARTY-NOTICES.md.