Unsaid
v1.0.0 Docs
🔍
🖥 Open App ⭐ GitHub
Hacktoberfest 2026 Weekend Challenge • "Build for a Friend"

A private place for the things you don't know how to say out loud.

Unsaid is an intentional, local-first reflection application for when you need to talk through something, unload racing thoughts without premature solutions, or practice saying what matters before facing another human.

📖 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.

⚠️ Non-Clinical Positioning Notice

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

Terminal (macOS, Linux, Windows PowerShell)
# 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.

System Data Flow
┌────────────────────────────────┐         ┌───────────────────────────────┐
│     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:

LM Studio Setup Instructions
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!
💡 Offline Mode Fallback

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:

Terminal Launch
# 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:

  1. Your messages and Gemma's streaming tokens write atomically to disk.
  2. The Desktop App checks the lightweight file timestamp or receives live updates through the internal API endpoint.
  3. New reflections appear automatically with a >_ Shell origin 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.

Voice Reflection Workflow
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:

🚨 Immediate Safety Interventions

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.