📖 Project Overview
Why Unsaid exists, who it is built for, and how it differs fundamentally from cloud chatbots.
We all have moments where our thoughts are tangled, emotionally heavy, or too sensitive to share with friends, colleagues, or social media. Most modern AI tools immediately attempt to optimize, diagnose, solve, or extract telemetry to the cloud.
Unsaid takes a completely different path:
Local-First & Private
No accounts, no trackers, no servers. All inference runs locally via LM Studio using open Google Gemma weights. Your innermost thoughts never leave your hardware.
Non-Clinical & Calming
Unsaid is not an AI therapist or medical diagnostic tool. It acts as an empathetic sounding board that listens deeply, asks clarifying questions, and respects your pace.
Dual Interfaces
Use the distraction-free desktop application or drop directly into the fast hacker-friendly interactive terminal CLI shell (unsaid shell).
Seamless Disk Bridge
Reflections created in the terminal CLI automatically synchronize in real-time with the desktop app via ~/.unsaid/reflections.json.
Unsaid is designed exclusively for self-reflection, journaling, and conversational rehearsal. It is not a substitute for professional mental health diagnosis, clinical psychotherapy, or emergency care.
⚡ Quickstart Guide
Clone, install dependencies, and launch both the desktop workspace and CLI shell.
1. Prerequisites
- Node.js: v18.0.0 or higher (nodejs.org)
- LM Studio: v0.3.0 or higher (lmstudio.ai)
- Model: Gemma 2 2B Instruct or Gemma 2 9B Instruct (GGUF format)
2. Installation & Launch
# 1. Clone the repository
git clone https://github.com/basutkar/unsaid.git
cd unsaid
# 2. Install dependencies
npm install
# 3. Launch the desktop application
npm run dev
# OR for the standalone window:
npm run desktop
# 4. Launch the interactive CLI shell in another terminal tab:
npm run shell
🏛️ Architecture & Data Flow
How the desktop frontend, CLI shell, local bridge, and LM Studio communicate.
┌────────────────────────────────┐ ┌───────────────────────────────┐
│ Unsaid Desktop App │ │ Unsaid CLI Shell │
│ (React 19 + TypeScript + Vite)│ │ (Node.js Interactive) │
└───────────────┬────────────────┘ └───────────────┬───────────────┘
│ │
│ GET/POST /api/reflections │ Direct Read/Write
▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ Local File Bridge: ~/.unsaid/reflections.json │
│ (Automatic Conflict-Free Bidirectional Sync) │
└─────────────────────────────────────────────────────────────┘
▲
│ Local HTTP Requests
▼
┌─────────────────────────────────────────────────────────────┐
│ LM Studio Local Inference Server │
│ http://localhost:1234/v1/chat/completions │
│ (Google Gemma 2 2B/9B Instruct GGUF) │
└─────────────────────────────────────────────────────────────┘
Unlike cloud-based chat apps with complex backend servers and user databases, Unsaid writes directly to your local file system at ~/.unsaid/reflections.json. The Vite development server provides a lightweight internal bridge proxy for the browser environment, allowing edits in either the CLI or Desktop to mirror instantly.
💭 The Three Reflection Modes
Tailored conversational frameworks depending on your current emotional state.
1. Talk Through It
A collaborative, empathetic dialogue. Gemma gently probes underlying emotions, helps reframe unhelpful assumptions, and provides constructive reflections without being pushy or robotic.
2. Just Unload
When you don't want advice or solutions. Dump your thoughts in continuous streams. The AI acts as a quiet witness, offering silent presence or brief, validating grounding thoughts only when requested.
3. The Unsaid (Roleplay)
Rehearse difficult conversations before you have them in real life. Specify who you need to speak to (partner, manager, parent) and their personality, then roleplay the exchange to discover clarity.
✉️ Letter Studio
Write letters you may never send — release emotional weight safely.
Some thoughts are best articulated in long-form prose addressed to someone specific. The Letter Studio provides a focused parchment writing canvas with therapeutic rituals:
- Burn Ritual: A therapeutic animation that permanently shreds the text from memory and disk, symbolizing release.
- Vault: Store encrypted reflections locally behind your optional 4-digit PIN lock.
- Gemma Mirror: Ask Gemma to read your draft and reflect back what emotion seems to be hiding beneath the words.
🎧 Ambient Soundscapes
Procedural, zero-bandwidth Web Audio background soundscapes.
To create an immersive, calming space without loading external audio assets, Unsaid incorporates a native Web Audio API synthesizer that generates procedural acoustics:
- 🌧️ Gentle Rain: Pink noise filtered through dual bandpass resonant nodes simulating raindrop strikes.
- 🔥 Cozy Fireplace: Low-frequency brown noise mixed with random pop and crackle impulse triggers.
- 🌊 Soft Stream: Smooth high-shelf filtered modulation for focused writing and unburdening.
🧠 LM Studio & Gemma Setup
Configure the local AI engine in under three minutes.
Unsaid is engineered to communicate with any OpenAI-compatible local server, but is specially tuned with system prompts for Google's open Gemma 2 models:
1. Download LM Studio from https://lmstudio.ai (Windows, macOS, Linux).
2. Open the Search tab in LM Studio and search for: "gemma-2-2b-it" or "gemma-2-9b-it".
3. Download a Q4_K_M or Q5_K_M GGUF quantization.
4. Go to the "Local Server" tab (the <-> icon on the left).
5. Select your loaded Gemma model at the top.
6. Click "Start Server". By default, it runs on http://localhost:1234.
7. Unsaid will immediately detect the server and show a green "Online" indicator!
If LM Studio is not running, Unsaid continues to work smoothly in Offline / Journal Mode. You can freely write, unload thoughts, search past sessions, and compose letters without AI inference.
⌨️ Unsaid CLI Shell
Full-featured terminal REPL for keyboard-centric reflection.
For developers and terminal lovers, unsaid includes an interactive terminal shell that provides all the power of the desktop app inside your favorite terminal:
# Start the interactive shell
npm run shell
# Or if linked globally:
unsaid
Interactive Shell Commands
| Command | Description |
|---|---|
talk |
Start a guided "Talk Through It" conversational session with Gemma |
unload |
Open a free-form stream-of-consciousness thought unburdening buffer |
unsaid |
Roleplay a difficult conversation with an AI partner persona |
history |
List all past reflections with dates, tags, and origin badges |
open <#> |
Read and continue a previous reflection session right in your terminal |
app |
Launch or bring the Unsaid Desktop Application to the foreground |
stats |
Display total reflections count, streak, and word counts |
clear / exit |
Clear terminal screen or exit the interactive shell session |
🔄 Desktop-CLI Realtime Bridge
Two interfaces, one single source of truth.
Unsaid uses an ultra-low latency file-based bridge stored at ~/.unsaid/reflections.json.
When you write in the CLI shell:
- Your messages and Gemma's streaming tokens write atomically to disk.
- The Desktop App checks the lightweight file timestamp or receives live updates through the internal API endpoint.
- New reflections appear automatically with a
>_ Shellorigin tag in the sidebar.
🎙️ Voice Agents & Handy Offline Dictation
Speak your raw thoughts out loud with zero cloud audio leakage.
Speaking thoughts out loud often accesses deeper emotions than typing. Unsaid pairs directly with Handy (cjpais/Handy)—a native, open-source offline speech-to-text tool powered by whisper.cpp and Vulkan:
Handy Global Hotkey
Press Ctrl + Space anywhere. Speak freely into your mic, and Handy's local Whisper model types the words straight into Unsaid's reflection composer.
In-App Voice Dictate
Click the built-in microphone button on the desktop composer or chat interface for instant in-browser voice input with live audio activity indicators.
100% Offline Audio
Unlike cloud voice assistants, your audio is transcribed directly on your local CPU or GPU. Zero voice recordings or acoustic profiles ever leave your machine.
1. Open Unsaid Desktop App (npm run dev or npm run desktop).
2. Handy Companion runs in the background (or click "Launch Handy" in Unsaid).
3. Press Ctrl + Space to dictate your thoughts out loud.
4. Watch your words stream into the Quick Reflection Composer.
5. Press Ctrl + Enter or click "Talk Through It" to reflect with Gemma 3 4B!
🛡️ Security Guardrails & Crisis Protocol
Responsible AI guardrails embedded directly into the application layer.
Unsaid actively monitors user input against a comprehensive, compassionate safety evaluation matrix before sending tokens to the local model:
If a user indicates self-harm, severe crisis, or suicidal ideation, Unsaid immediately halts standard generative responses and displays an emergency crisis card with direct helpline contact information.
Guardrail Rules:
- No Medical / Diagnostic Claims: The model is constrained to never label symptoms with DSM-5 psychiatric diagnoses.
- No Medication Advice: Unsaid refuses to discuss dosages or prescribe pharmaceuticals.
- Compassionate De-escalation: Responses focus on grounding, breathing exercises, and encouraging real-world human support.
🆘 24/7 Crisis Helplines
Free, confidential support available anytime you need human support.
| Country / Region | Helpline Service | Contact Details |
|---|---|---|
| United States & Canada | Suicide & Crisis Lifeline | Call or text 988 (24/7, Free & Confidential) |
| United Kingdom | Samaritans / NHS 111 | Call 116 123 or call 111 |
| Australia | Lifeline Australia | Call 13 11 14 |
| International | Befrienders Worldwide | befrienders.org |
🔒 Privacy Guarantee
Why "Local First" is the only ethical foundation for personal reflection.
Cloud AI providers log prompts, train on chat transcripts, and are vulnerable to data breaches. With Unsaid:
- Your messages stay strictly in local memory and in
~/.unsaid/reflections.json. - Network calls only route to
http://localhost:1234. Disconnecting your Wi-Fi changes nothing. - You can set an optional 4-digit PIN lock to prevent shoulder-surfing on shared computers.
⌨️ Keyboard Shortcuts Reference
Fly through Unsaid without reaching for your mouse.
| Shortcut | Action |
|---|---|
| Ctrl + N / Cmd + N | Start a new reflection session |
| Ctrl + B / Cmd + B | Toggle reflection history sidebar |
| Ctrl + K / Cmd + K | Focus reflection search & filter bar |
| Ctrl + Enter | Send reflection message to Gemma |
| Esc | Close active modal or blur input |
🔧 Troubleshooting
Quick resolutions for common local development situations.
Q: The indicator shows "Local Model Offline"
Make sure LM Studio is open, your model is selected, and you have clicked Start Server on port 1234. Verify in your browser by visiting http://localhost:1234/v1/models.
Q: Reflections created in the CLI don't show in the App
Ensure you are running the desktop app with npm run dev or npm run desktop so that the Vite local bridge endpoint is active. The app checks every 3 seconds for updates.