Beautiful terminal mood tracker with interactive TUI interface. Track your emotions, analyze trends, and take care of your mental health.
- Mood Tracking — Rate your day from 0 to 10 with emoji feedback
- Interactive Statistics — Visual charts, trends, and mood distribution
- History View — Browse all previous entries in a clean table
- Pastel UI — Soft, eye-friendly color scheme with Lipgloss
- Keyboard + Mouse Support — Navigate with arrows, hjkl, or click
- Local-First — All data stored locally in SQLite (no cloud required)
- Clean Architecture — DDD principles, testable, maintainable code
| Component | Technology |
|---|---|
| Language | Go 1.21+ |
| TUI Framework | Bubble Tea — The Elm Architecture for terminal |
| Styling | Lipgloss — Styles and colors |
| Components | Bubbles — Ready-made UI components |
| Database | SQLite with go-sqlite3 driver |
| UUID | Google UUID |
- Go 1.21 or higher
- GCC (for SQLite C bindings compilation)
- Linux/macOS (or WSL on Windows)
git clone https://github.com/ignavan39/mood_diary_tui.git
cd mood_diary_tuigo mod downloadgo build -o mood-diary ./cmd/mood-diary./mood-diaryOr run directly with Go:
go run ./cmd/mood-diarymake install
# Adds binary to ~/.local/bin/mood-diary
# Make sure ~/.local/bin is in your $PATHOn launch, you'll see the main menu with options:
→ 📝 Record mood today
📊 View statistics
📅 History
❌ Exit
Controls:
↑/↓orj/k— Navigate menuEnter— Select optionqorCtrl+C— Quit
- Select "Record mood" from main menu
- Use
←/→to choose mood level (0–10) - Press
Enterto add an optional note - Confirm with
yorEnter
Mood Scale:
😢 😞 😔 😕 😐 😶 🙂 😊 😄 😁 🤩
0 1 2 3 4 5 6 7 8 9 10
Statistics display:
- Total entries for selected period
- Average mood level
- Trend — improving, worsening, or stable
- Distribution — histogram by mood levels
- Dynamics — sparkline chart of mood changes
Periods:
- Week (7 days)
- Month (30 days)
- Quarter (90 days)
- Year (365 days)
- All time
Controls:
←/→— Switch periodsr— Refresh dataEsc— Return to menu
Browse all previous entries in table format:
Date Mood Note
──────────────────────────────────────────
01.04.2026 😊 8/10 Great day!
31.03.2026 😐 5/10 Regular day
30.03.2026 😄 9/10 Finished project
Controls:
↑/↓orj/k— Navigate entriesEnter— Edit entry (WIP)r— Refresh listEsc— Return to menu
Project follows Domain-Driven Design (DDD) and Clean Architecture principles:
mood_diary_tui/
├── cmd/
│ └── mood-diary/ # Application entry point
│ └── main.go
├── internal/
│ ├── domain/ # Business logic (core)
│ │ ├── entity/ # Entities
│ │ ├── repository/ # Repository interfaces
│ │ └── service/ # Domain services
│ ├── application/ # Application layer
│ │ └── usecase/ # Use Cases (business scenarios)
│ ├── infrastructure/ # Infrastructure layer
│ │ ├── persistence/# Repository implementations
│ │ └── database/ # DB configuration
│ └── presentation/ # Presentation layer
│ ├── tui/ # TUI components
│ └── styles/ # Styles and colors
├── go.mod
├── go.sum
└── README.md
- Entity:
MoodEntry— main entity with validation - Value Objects:
MoodLevel— mood level (0-10) - Repository Interfaces: Abstractions for data access
- Use Cases:
MoodService— business scenarios (record, update, statistics)
- Database: SQLite configuration with migrations
- Repository:
SQLiteMoodRepository— repository implementation
- TUI: Interactive screens built with Bubble Tea
- Styles: Pastel color scheme
CREATE TABLE mood_entries (
id TEXT PRIMARY KEY,
date DATE NOT NULL UNIQUE,
level INTEGER NOT NULL CHECK(level >= 0 AND level <= 10),
note TEXT,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Indexes for fast queries
CREATE INDEX idx_mood_entries_date ON mood_entries(date DESC);
CREATE INDEX idx_mood_entries_date_range ON mood_entries(date);Database is created automatically at:
~/.mood-diary/mood_diary.db
- WAL Mode — Write-Ahead Logging for better performance
- Unique constraint on date — only one entry per day
- Automatic triggers for
updated_atupdates - Soft delete support (WIP)
Application uses a pastel color palette for comfortable viewing:
// Main colors
PastelPink #FFB3BA
PastelPeach #FFDFBA
PastelYellow #FFFFBA
PastelMint #BAFFC9
PastelSky #BAE1FF
PastelLavender #D4BAFF
PastelRose #FFBAE8Colors transition from pastel red (sad) to pastel blue (happy):
😢 → 😞 → 😔 → 😕 → 😐 → 😶 → 🙂 → 😊 → 😄 → 😁 → 🤩
🔴 → 🟠 → 🟡 → ⚪ → 🔵 → 💙
- Domain Layer: Add new entities or value objects
- Repository: Extend repository interface
- Use Case: Create new use case in application layer
- TUI: Add new screen or component
// 1. Domain Entity
type Tag struct {
ID uuid.UUID
Name string
}
// 2. Repository
type TagRepository interface {
Create(ctx context.Context, tag *Tag) error
FindByMoodID(ctx context.Context, moodID uuid.UUID) ([]*Tag, error)
}
// 3. Use Case
func (s *MoodService) AddTag(ctx context.Context, moodID uuid.UUID, tag string) error {
// Implementation
}
// 4. TUI Screen
type TagsScreen struct {
// Implementation
}Application calculates:
- Average mood level for period
- Trend — linear regression over recent entries
- Distribution — count of entries per mood level
- Dynamics — sparkline chart of changes
Trend = AverageSecondHalf - AverageFirstHalf
> 0.5 : Improving ↑
< -0.5 : Worsening ↓
else : Stable ─
Contributions are welcome!
- Fork the repository
- Create feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow Go standards (
gofmt,golint) - Document public functions
- Adhere to Clean Architecture principles
- Data export (CSV, JSON)
- Data import
- Tags and categories
- Search notes
- Advanced visualization (calendar heatmap)
- Reminder notifications
- Backup/Restore functionality
- Additional themes
- Internationalization (more languages)
MIT License — see LICENSE for details.
Ivan Ignatenko
- GitHub: @ignavan39
💙 Take care of your mental health, one day at a time.
Красивый терминальный дневник настроения с интерактивным интерфейсом. Отслеживайте свои эмоции, анализируйте тренды и заботьтесь о своём ментальном здоровье.
- Запись настроения — Отмечайте своё настроение по шкале от 0 до 10 с эмодзи
- Интерактивная статистика — Визуализация данных с графиками и трендами
- История записей — Просмотр всех предыдущих записей в табличном формате
- Пастельный интерфейс — Приятный глазу интерфейс в мягких тонах через Lipgloss
- Удобная навигация — Управление клавиатурой и мышью
- Локальное хранение — Все данные хранятся локально в SQLite, без облака
- Чистая архитектура — Принципы DDD, тестируемость, поддержка кода
| Компонент | Технология |
|---|---|
| Язык | Go 1.21+ |
| TUI Framework | Bubble Tea — The Elm Architecture для терминала |
| Стилизация | Lipgloss — Стили и цвета |
| Компоненты | Bubbles — Готовые UI компоненты |
| База данных | SQLite с драйвером go-sqlite3 |
| UUID | Google UUID |
- Go 1.21 или выше
- GCC (для компиляции C-привязок SQLite)
- Linux/macOS (или WSL на Windows)
git clone https://github.com/ignavan39/mood_diary_tui.git
cd mood_diary_tuigo mod downloadgo build -o mood-diary ./cmd/mood-diary./mood-diaryИли напрямую через Go:
go run ./cmd/mood-diarymake install
# Бинарник добавится в ~/.local/bin/mood-diary
# Убедитесь, что ~/.local/bin есть в $PATHПри запуске вы увидите главное меню с опциями:
→ 📝 Записать настроение
📊 Посмотреть статистику
📅 История записей
❌ Выход
Управление:
↑/↓илиj/k— навигацияEnter— выборqилиCtrl+C— выход
- Выберите "Записать настроение" в главном меню
- Используйте
←/→для выбора уровня настроения (0–10) - Нажмите
Enterдля перехода к заметке - Введите заметку (необязательно) и нажмите
Enter - Подтвердите запись нажатием
yилиEnter
Шкала настроений:
😢 😞 😔 😕 😐 😶 🙂 😊 😄 😁 🤩
0 1 2 3 4 5 6 7 8 9 10
Статистика показывает:
- Всего записей за выбранный период
- Средний уровень настроения
- Тренд — улучшается, ухудшается или стабильно
- Распределение — гистограмма по уровням настроения
- Динамика — график изменения настроения за период
Периоды:
- Неделя (7 дней)
- Месяц (30 дней)
- Квартал (90 дней)
- Год (365 дней)
- Всё время
Управление:
←/→— переключение периодовr— обновить данныеEsc— вернуться в меню
Просмотр всех предыдущих записей в табличном формате:
Дата Настроение Заметка
──────────────────────────────────────────
01.04.2026 😊 8/10 Отличный день!
31.03.2026 😐 5/10 Обычный день
30.03.2026 😄 9/10 Закончил проект
Управление:
↑/↓илиj/k— навигация по записямEnter— редактировать запись (в разработке)r— обновить списокEsc— вернуться в меню
Проект следует принципам Domain-Driven Design (DDD) и Clean Architecture:
mood_diary_tui/
├── cmd/
│ └── mood-diary/ # Точка входа приложения
│ └── main.go
├── internal/
│ ├── domain/ # Бизнес-логика (ядро)
│ │ ├── entity/ # Сущности
│ │ ├── repository/ # Интерфейсы репозиториев
│ │ └── service/ # Доменные сервисы
│ ├── application/ # Прикладной слой
│ │ └── usecase/ # Use Cases (бизнес-сценарии)
│ ├── infrastructure/ # Инфраструктурный слой
│ │ ├── persistence/# Реализации репозиториев
│ │ └── database/ # Конфигурация БД
│ └── presentation/ # Слой представления
│ ├── tui/ # TUI компоненты
│ └── styles/ # Стили и цвета
├── go.mod
├── go.sum
└── README.md
- Entity:
MoodEntry— основная сущность с валидацией - Value Objects:
MoodLevel— уровень настроения (0-10) - Repository Interfaces: Абстракции для работы с данными
- Use Cases:
MoodService— бизнес-сценарии (запись, обновление, статистика)
- Database: Конфигурация SQLite с миграциями
- Repository:
SQLiteMoodRepository— реализация репозитория
- TUI: Интерактивные экраны на Bubble Tea
- Styles: Пастельная цветовая схема
CREATE TABLE mood_entries (
id TEXT PRIMARY KEY,
date DATE NOT NULL UNIQUE,
level INTEGER NOT NULL CHECK(level >= 0 AND level <= 10),
note TEXT,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Индексы для быстрого поиска
CREATE INDEX idx_mood_entries_date ON mood_entries(date DESC);
CREATE INDEX idx_mood_entries_date_range ON mood_entries(date);База данных создаётся автоматически в:
~/.mood-diary/mood_diary.db
- WAL Mode — Write-Ahead Logging для лучшей производительности
- Unique constraint на дату — только одна запись в день
- Автоматические триггеры для обновления
updated_at - Soft delete поддержка (в разработке)
Приложение использует следующую цветовую палитру для комфортного просмотра:
// Основные цвета
PastelPink #FFB3BA
PastelPeach #FFDFBA
PastelYellow #FFFFBA
PastelMint #BAFFC9
PastelSky #BAE1FF
PastelLavender #D4BAFF
PastelRose #FFBAE8Цвета меняются от пастельно-красного (грустно) до пастельно-голубого (счастливо):
😢 → 😞 → 😔 → 😕 → 😐 → 😶 → 🙂 → 😊 → 😄 → 😁 → 🤩
🔴 → 🟠 → 🟡 → ⚪ → 🔵 → 💙
- Доменный слой: Добавьте новые entity или value objects
- Репозиторий: Расширьте интерфейс репозитория
- Use Case: Создайте новый use case в application layer
- TUI: Добавьте новый экран или компонент
// 1. Domain Entity
type Tag struct {
ID uuid.UUID
Name string
}
// 2. Repository
type TagRepository interface {
Create(ctx context.Context, tag *Tag) error
FindByMoodID(ctx context.Context, moodID uuid.UUID) ([]*Tag, error)
}
// 3. Use Case
func (s *MoodService) AddTag(ctx context.Context, moodID uuid.UUID, tag string) error {
// Implementation
}
// 4. TUI Screen
type TagsScreen struct {
// Implementation
}Приложение вычисляет:
- Средний уровень настроения за период
- Тренд — линейная регрессия за последние записи
- Распределение — количество записей по каждому уровню
- Динамика — sparkline график изменений
Тренд = СреднееВторойПоловины - СреднееПервойПоловины
> 0.5 : Улучшается ↑
< -0.5 : Ухудшается ↓
else : Стабильно ─
Приветствуются contributions!
- Fork репозиторий
- Создайте feature branch (
git checkout -b feature/amazing-feature) - Commit изменения (
git commit -m 'Add amazing feature') - Push в branch (
git push origin feature/amazing-feature) - Откройте Pull Request
- Следуйте стандартам Go (
gofmt,golint) - Документируйте публичные функции
- Придерживайтесь принципов Clean Architecture
- Экспорт данных (CSV, JSON)
- Импорт данных
- Теги и категории
- Поиск по заметкам
- Более сложная визуализация (календарь-тепловая карта)
- Напоминания о записи
- Backup/Restore функциональность
- Дополнительные темы оформления
- Интернационализация (больше языков)
MIT License — подробности в файле LICENSE.
Иван Игнатенко
- GitHub: @ignavan39
💙 Заботьтесь о своём ментальном здоровье — один день за раз.
