vault backup: 2026-04-29 14:14:13

This commit is contained in:
2026-04-29 14:14:13 +03:00
parent 3f0dfdbd95
commit 543cdad3e0
21 changed files with 2 additions and 2 deletions

View File

@@ -0,0 +1,324 @@
# Pulse — Архитектура проекта
## Обзор
**Pulse** — персональное productivity-приложение для управления задачами, привычками и напоминаниями с интеграцией Telegram-бота.
## Технологический стек
### Backend (pulse-api)
- **Язык:** Go 1.22
- **Web-фреймворк:** chi/v5
- **База данных:** PostgreSQL 16
- **ORM:** sqlx (raw SQL + struct mapping)
- **Аутентификация:** JWT (access 15 мин / refresh 365 дней)
- **Email:** Resend API
- **Telegram:** go-telegram-bot-api/v5
- **Scheduler:** robfig/cron/v3
- **Контейнеризация:** Docker + Docker Compose
### Frontend (pulse-web)
- **Фреймворк:** React 18
- **Сборщик:** Vite 5
- **Стили:** TailwindCSS
- **Состояние:** Zustand (auth), TanStack Query (data fetching)
- **Анимации:** Framer Motion
- **Иконки:** Lucide React
- **Контейнеризация:** nginx:alpine
### Инфраструктура
- **Хостинг:** VM Ubuntu (192.168.31.60)
- **Reverse proxy:** Nginx Proxy Manager
- **SSL:** Let's Encrypt (auto-renew)
- **Git:** Gitea (git.digital-home.site)
- **Домены:**
- API: api.digital-home.site
- Web: pulse.digital-home.site
## Структура Backend
```
homelab-api/
├── cmd/api/
│ └── main.go # Точка входа, инициализация
├── internal/
│ ├── bot/
│ │ ├── bot.go # Telegram bot, long polling
│ │ └── handlers.go # Обработчики команд и callback
│ ├── config/
│ │ └── config.go # Загрузка переменных окружения
│ ├── handler/
│ │ ├── auth.go # Регистрация, логин, JWT
│ │ ├── habits.go # CRUD привычек
│ │ ├── health.go # Health check
│ │ ├── profile.go # Профиль пользователя
│ │ └── tasks.go # CRUD задач
│ ├── middleware/
│ │ └── auth.go # JWT middleware
│ ├── model/
│ │ ├── habit.go # Модель привычки
│ │ ├── task.go # Модель задачи
│ │ └── user.go # Модель пользователя
│ ├── repository/
│ │ ├── db.go # Подключение к PostgreSQL
│ │ ├── habit.go # SQL-запросы для привычек
│ │ ├── task.go # SQL-запросы для задач
│ │ └── user.go # SQL-запросы для пользователей
│ ├── scheduler/
│ │ └── scheduler.go # Cron jobs для уведомлений
│ └── service/
│ ├── auth.go # Бизнес-логика авторизации
│ ├── email.go # Отправка email через Resend
│ ├── habit.go # Бизнес-логика привычек
│ └── task.go # Бизнес-логика задач
├── Dockerfile
├── docker-compose.yml
├── go.mod
└── go.sum
```
## Структура Frontend
```
pulse-web/
├── public/
│ └── favicon.svg # Иконка молния ⚡
├── src/
│ ├── api/
│ │ ├── client.js # Axios instance + interceptors
│ │ ├── habits.js # API привычек
│ │ ├── profile.js # API профиля
│ │ └── tasks.js # API задач
│ ├── components/
│ │ ├── CreateHabitModal.jsx
│ │ ├── CreateTaskModal.jsx
│ │ ├── EditHabitModal.jsx
│ │ ├── EditTaskModal.jsx
│ │ └── Navigation.jsx # Нижняя навигация
│ ├── pages/
│ │ ├── ForgotPassword.jsx
│ │ ├── Habits.jsx # Управление привычками
│ │ ├── Home.jsx # Главная (сегодня)
│ │ ├── Login.jsx
│ │ ├── Register.jsx
│ │ ├── ResetPassword.jsx
│ │ ├── Settings.jsx # Настройки профиля
│ │ ├── Stats.jsx # Статистика
│ │ ├── Tasks.jsx # Управление задачами
│ │ └── VerifyEmail.jsx
│ ├── store/
│ │ └── auth.js # Zustand store для авторизации
│ ├── App.jsx # Роутинг
│ ├── index.css # Глобальные стили
│ └── main.jsx # Entry point
├── Dockerfile
├── docker-compose.yml
├── index.html
├── nginx.conf
├── package.json
├── tailwind.config.js
└── vite.config.js
```
## База данных
### Таблицы
```sql
-- Пользователи
users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
username VARCHAR(100) NOT NULL,
password_hash VARCHAR(255) NOT NULL,
email_verified BOOLEAN DEFAULT FALSE,
telegram_chat_id BIGINT,
notifications_enabled BOOLEAN DEFAULT TRUE,
timezone VARCHAR(50) DEFAULT 'Europe/Moscow',
morning_reminder_time TIME DEFAULT '09:00',
evening_reminder_time TIME DEFAULT '21:00',
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
)
-- Задачи
tasks (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
title VARCHAR(255) NOT NULL,
description TEXT,
icon VARCHAR(10) DEFAULT '📋',
color VARCHAR(7) DEFAULT '#6B7280',
due_date DATE,
priority INTEGER DEFAULT 0, -- 0=none, 1=low, 2=medium, 3=high
reminder_time TIME,
completed_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
)
-- Привычки
habits (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
name VARCHAR(255) NOT NULL,
description TEXT,
icon VARCHAR(10) DEFAULT '',
color VARCHAR(7) DEFAULT '#10B981',
frequency VARCHAR(20) DEFAULT 'daily', -- daily, weekly, custom
target_days INTEGER[], -- [1,3,5] для пн,ср,пт
target_count INTEGER DEFAULT 1,
reminder_time TIME,
archived BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
)
-- Логи привычек
habit_logs (
id SERIAL PRIMARY KEY,
habit_id INTEGER REFERENCES habits(id),
user_id INTEGER REFERENCES users(id),
date DATE NOT NULL,
count INTEGER DEFAULT 1,
created_at TIMESTAMP DEFAULT NOW()
)
-- Email токены
email_tokens (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
token VARCHAR(255) NOT NULL,
type VARCHAR(50) NOT NULL, -- verification, password_reset
expires_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
)
```
## API Endpoints
### Авторизация
| Method | Endpoint | Описание |
|--------|----------|----------|
| POST | /auth/register | Регистрация |
| POST | /auth/login | Вход |
| POST | /auth/refresh | Обновить токены |
| POST | /auth/verify-email | Подтвердить email |
| POST | /auth/forgot-password | Запросить сброс пароля |
| POST | /auth/reset-password | Сбросить пароль |
### Профиль (требует JWT)
| Method | Endpoint | Описание |
|--------|----------|----------|
| GET | /profile | Получить профиль |
| PUT | /profile | Обновить профиль |
### Задачи (требует JWT)
| Method | Endpoint | Описание |
|--------|----------|----------|
| GET | /tasks | Список задач |
| GET | /tasks/today | Задачи на сегодня |
| POST | /tasks | Создать задачу |
| GET | /tasks/{id} | Получить задачу |
| PUT | /tasks/{id} | Обновить задачу |
| DELETE | /tasks/{id} | Удалить задачу |
| POST | /tasks/{id}/complete | Отметить выполненной |
| POST | /tasks/{id}/uncomplete | Снять отметку |
### Привычки (требует JWT)
| Method | Endpoint | Описание |
|--------|----------|----------|
| GET | /habits | Список привычек |
| POST | /habits | Создать привычку |
| GET | /habits/{id} | Получить привычку |
| PUT | /habits/{id} | Обновить привычку |
| DELETE | /habits/{id} | Удалить (архивировать) |
| POST | /habits/{id}/log | Отметить выполнение |
| GET | /habits/{id}/logs | История выполнений |
| DELETE | /habits/{id}/logs/{logId} | Удалить запись |
| GET | /habits/stats | Общая статистика |
| GET | /habits/{id}/stats | Статистика привычки |
## Telegram Bot
### Команды
| Команда | Описание |
|---------|----------|
| /start | Показать Chat ID |
| /tasks | Задачи на сегодня |
| /habits | Привычки на сегодня |
| /help | Справка |
### Inline кнопки
- ✅ Выполнено — отмечает задачу/привычку
- 🗑 Удалить — удаляет задачу
- ⏰ +30 мин — откладывает напоминание
### Уведомления
1. **Утреннее** (настраивается): задачи и привычки на сегодня
2. **Вечернее** (настраивается): итоги дня
3. **Индивидуальные**: по reminder_time каждой задачи/привычки
## Docker Compose
### Backend (homelab-api)
```yaml
services:
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: homelab
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: homelab
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
api:
build: .
environment:
- DATABASE_URL=postgres://homelab:${DB_PASSWORD}@db:5432/homelab?sslmode=disable
- JWT_SECRET=${JWT_SECRET}
- RESEND_API_KEY=${RESEND_API_KEY}
- TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
depends_on:
- db
networks:
- backend
- services_proxy
```
### Frontend (pulse-web)
```yaml
services:
web:
build: .
networks:
- services_proxy
```
## Дизайн
### Цвета
- **Primary (Deep Teal):** #115E59
- **Accent (Burnished Amber):** #F59E0B
- **Surface:** #F8FAFC
- **Text:** #1E293B
### Шрифты
- **Body:** Inter (Google Fonts)
### UI-компоненты
- Карточки с тенями и закруглениями (rounded-2xl)
- Backdrop blur для header
- Framer Motion анимации
- Inline кнопки в Telegram
## Репозитории
- **Backend:** https://git.digital-home.site/daniil/pulse-api
- **Frontend:** https://git.digital-home.site/daniil/pulse-web
---
*Создано: 2026-02-06*

View File

@@ -0,0 +1,66 @@
# Pulse — Система уведомлений
## Telegram бот
**Бот:** @pulse_tracking_bot
**Токен:** `8440343622:AAFM0gaI3Uaqj10WcEIPYf70zWo41kSB2So`
### Функционал
- При `/start` бот отправляет пользователю его `chat_id`
- `/tasks` — задачи на сегодня с кнопками
- `/habits` — привычки на сегодня с кнопками
- Inline кнопки: "✅ Выполнено", "🗑 Удалить", "⏰ +30 мин"
## Профиль пользователя
### Настройки
- Telegram Chat ID
- Уведомления вкл/выкл
- Часовой пояс
- Время утреннего уведомления (default: 09:00)
- Время вечернего уведомления (default: 21:00)
## Логика уведомлений
### Утреннее уведомление
- Время: настраивается в профиле (default 09:00)
- Содержит: задачи на сегодня, привычки на сегодня
### Вечернее уведомление (итоги дня)
- Время: настраивается в профиле (default 21:00)
- Содержит:
- 📋 Задачи: ✅ выполнено / ⬜ осталось
- 🎯 Привычки: ✅ выполнено / ⬜ осталось
- Список невыполненных привычек
- Мотивационное сообщение
### Индивидуальные напоминания
- Для каждой задачи/привычки можно установить `reminder_time`
- Если к этому времени не выполнено → push в Telegram
- Кнопки: "✅ Выполнено", "⏰ +30 мин"
## Интеграция с Cosmo (OpenClaw)
### Workflow
- **Задачи от Даниила** → Cosmo создаёт в Pulse API
- **Привычки** → Cosmo создаёт в Pulse API
- **Встречи/события** → Google Calendar (gog)
- **Уведомления** → приходят в @pulse_tracking_bot
### API для Cosmo
```bash
# Создать задачу
curl -X POST https://api.digital-home.site/tasks \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"...", "due_date":"2026-02-10", "reminder_time":"09:00"}'
# Создать привычку
curl -X POST https://api.digital-home.site/habits \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"...", "frequency":"daily", "reminder_time":"17:00"}'
```
---
*Обновлено: 2026-02-06*

View File

@@ -0,0 +1,148 @@
# Pulse — Telegram Bot
Бот как полноценный интерфейс к Pulse. Управление задачами и привычками без захода на сайт.
## Авторизация
### Связка аккаунта
1. Пользователь отправляет `/start`
2. Бот отвечает: "Привет! Твой chat_id: `123456789`. Добавь его в настройках профиля на сайте."
3. После привязки бот может отправлять уведомления и принимать команды
### Альтернатива: Magic Link
- `/login` → бот отправляет одноразовую ссылку для входа
- Или код подтверждения, который вводишь на сайте
## Команды
### Задачи
| Команда | Описание |
|---------|----------|
| `/tasks` | Список задач на сегодня (все) |
| `/tasks remaining` | Только невыполненные задачи |
| `/tasks all` | Все активные задачи |
| `/task <текст>` | Создать новую задачу |
| `/done <id>` | Отметить задачу выполненной |
| `/undone <id>` | Снять отметку выполнения |
**Примеры:**
```
/task Купить молоко
/task Позвонить врачу !высокий @завтра
/done 15
```
**Флаги при создании:**
- `!высокий` / `!средний` / `!низкий` — приоритет
- `@сегодня` / `@завтра` / `@10.02` — дедлайн
- `🔔17:00` — напоминание
### Привычки
| Команда | Описание |
|---------|----------|
| `/habits` | Привычки на сегодня |
| `/habits all` | Все привычки |
| `/check <id>` | Отметить привычку выполненной |
| `/uncheck <id>` | Снять отметку |
**Примеры:**
```
/habits
/check 3
```
### Статистика
| Команда | Описание |
|---------|----------|
| `/stats` | Краткая статистика (выполнено сегодня, streak) |
| `/stats week` | Статистика за неделю |
### Настройки
| Команда | Описание |
|---------|----------|
| `/settings` | Текущие настройки уведомлений |
| `/notify on` / `/notify off` | Вкл/выкл уведомления |
| `/morning 09:00` | Установить время утреннего уведомления |
## Inline кнопки
Для удобства бот отправляет сообщения с кнопками:
### Список задач
```
📋 Задачи на сегодня:
1. [ ] Купить молоко
2. [ ] Позвонить врачу (!)
3. [✓] Оплатить счета
[✅ Отметить] [ Новая задача]
```
При нажатии "Отметить" → показать список для выбора.
### Уведомление о привычке
```
🔔 Напоминание: Гитара 🎸
Время заниматься! (17:00)
[✅ Выполнено] [⏰ Напомни через 30 мин]
```
## Быстрые ответы
Бот понимает текст без команд в контексте:
- После `/tasks` можно просто написать "купить хлеб" → создаст задачу
- После показа списка можно написать "1" → отметит задачу #1
## Архитектура
### Хранение состояния
- Redis или in-memory map для user states
- Состояния: `idle`, `awaiting_task_text`, `awaiting_habit_check`
### Обработка команд
```go
type BotHandler struct {
taskService *service.TaskService
habitService *service.HabitService
userService *service.UserService
}
func (h *BotHandler) HandleUpdate(update tgbotapi.Update) {
// роутинг команд
}
```
### Связь с основным API
- Бот использует те же сервисы что и HTTP API
- Авторизация по telegram_chat_id → user_id
## Безопасность
- Команды работают только для привязанных аккаунтов
- Rate limiting на создание задач
- Логирование действий через бота
## TODO
- [ ] Базовые команды: /start, /tasks, /habits
- [ ] Создание задач через /task
- [ ] Отметка выполнения: /done, /check
- [ ] Inline кнопки для быстрых действий
- [ ] Контекстные быстрые ответы
- [ ] Настройки через бота
## Приоритет реализации
1. **MVP:** /start, /tasks, /habits, /done, /check
2. **v1.1:** Создание задач, inline кнопки
3. **v1.2:** Быстрые ответы, статистика, настройки
---
*Создано: 2026-02-06*

View File

@@ -0,0 +1,298 @@
# Анализ конкурентов для Pulse App
**Дата:** 15 февраля 2026
**Цель:** Понять рынок habit tracker приложений и сформировать стратегию развития Pulse
---
## 📊 1. Сравнительная таблица
### Базовая информация
| Приложение | Платформы | Рейтинг | Загрузки | Целевая аудитория |
|------------|-----------|---------|----------|-------------------|
| **Habitify** | iOS, Android, Web, macOS, watchOS | 4.7★ | 3M+ | Продуктивные профессионалы, кросс-платформенные пользователи |
| **Atoms** | iOS only | 4.5★ | 500K+ | Фанаты книги "Atomic Habits", premium сегмент |
| **Streaks** | iOS, macOS, watchOS, Vision Pro | 4.8★ | 2M+ | Apple ecosystem пользователи, минималисты |
| **Habitica** | iOS, Android, Web | 4.3★ | 10M+ | Геймеры, молодёжь, любители RPG |
| **Loop Habit Tracker** | Android | 4.7★ | 5M+ | Privacy-focused, open-source энтузиасты |
| **Fabulous** | iOS, Android | 4.6★ | 10M+ | Self-improvement seekers, wellness-focused |
| **Done** | iOS only | 4.6★ | 500K+ | Простые пользователи, фокус на гибкости |
| **Productive** | iOS only | 4.7★ | 3M+ | Пользователи iOS ищущие guided experience |
| **Way of Life** | iOS, Android | 4.6★ | 1M+ | Data-driven пользователи, аналитики |
| **HabitNow** | Android only | 4.6★ | 5M+ | Android пользователи, budget-conscious |
### Модель монетизации
| Приложение | Free план | Месяц | Год | Lifetime | Trial |
|------------|-----------|-------|-----|----------|-------|
| **Habitify** | 15 check-ins/нед | $4.99 | $34.99 | $64.99 | 7 дней |
| **Atoms** | 1-3 привычки | $10 | $70 | — | 28 дней |
| **Streaks** | — | — | — | $4.99 (one-time) | — |
| **Habitica** | Полный функционал | $4.99 | $47.99 | — | — |
| **Loop** | Полный (open-source) | Бесплатно | — | — | — |
| **Fabulous** | Ограниченные journeys | $3.33 | $39.99 | — | 7 дней |
| **Done** | Ограничено привычек | — | — | $24.99-$99.99* | — |
| **Productive** | Ограничено | $6.99 | $34.99 | — | 7 дней |
| **Way of Life** | 3 привычки | $4.99 | ~$30 | $49.99 | — |
| **HabitNow** | 7 привычек | — | — | $11.99 | — |
*Done часто со скидками до 95%
### Ключевые функции
| Приложение | Daily | Weekly | Custom | Напоминания | Статистика | Виджеты | Watch | Health интеграция | Gamification | Социальные | Оффлайн |
|------------|-------|--------|--------|-------------|------------|---------|-------|-------------------|--------------|------------|---------|
| **Habitify** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | Стрики | ❌ | ✅ |
| **Atoms** | ✅ | ❌ | ❌ | ✅ | Базовая | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ |
| **Streaks** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | Стрики | Sharing | ✅ |
| **Habitica** | ✅ | ❌ | ✅ | ✅ | Базовая | ❌ | ❌ | ❌ | 🎮 RPG полная | Parties/Guilds | ❌ |
| **Loop** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | Стрики/Score | ❌ | ✅ |
| **Fabulous** | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | Journeys | Circles | ❌ |
| **Done** | ✅ | ✅ | ✅ | Premium | ✅ | ✅ | ❌ | ❌ | Стрики | ❌ | ✅ |
| **Productive** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | Challenges | ❌ | ✅ |
| **Way of Life** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | Chains | ❌ | ✅ |
| **HabitNow** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | Стрики | ❌ | ✅ |
---
## 💰 2. Анализ монетизации
### Популярные модели
1. **Freemium с подпиской** (Habitify, Productive, Fabulous)
- Free: ограниченное количество привычек или функций
- Premium: $3-7/месяц или $30-40/год
- Самая распространённая модель
2. **One-time purchase** (Streaks, HabitNow, Done)
- $5-15 единоразово
- Привлекает пользователей, не любящих подписки
- Работает для iOS (Apple Store friendly)
3. **Open-source / Free** (Loop, Habitica Free)
- Монетизация через donations или premium косметику
- Привлекает privacy-conscious аудиторию
4. **Premium-first** (Atoms)
- Высокая цена ($70-120/год)
- Бренд автора (James Clear)
- Узкая, но платёжеспособная аудитория
### Средние цены на рынке
| Тип | Диапазон | Среднее |
|-----|----------|---------|
| Месячная подписка | $3.33 - $10 | **$5-6** |
| Годовая подписка | $30 - $70 | **$35-40** |
| Lifetime | $25 - $100 | **$50-65** |
| One-time (iOS) | $5 - $12 | **$6** |
### Что работает лучше
- **7-дневный trial** — стандарт индустрии
- **Ограничение количества привычек** в free версии (3-7)
- **Lifetime purchase** как upsell для лояльных пользователей
- **Скидки 50-80%** на lifetime при запуске и праздниках
---
## ✅ 3. Must-have функции (базовый стандарт)
Функции, которые есть у **всех топовых приложений** — без них не конкурентоспособны:
### Типы привычек
-**Daily habits** — ежедневные привычки
-**Weekly habits** — X раз в неделю
-**Custom schedule** — гибкое расписание (вт, чт, сб)
### Напоминания
-**Push-уведомления** с выбором времени
-**Несколько напоминаний** на одну привычку
-**Smart reminders** (location-based — опционально)
### Отслеживание прогресса
-**Streak counter** — текущая серия
-**Calendar view** — визуализация выполнения
-**Completion rate** — процент выполнения
-**Graphs/Charts** — тренды за период
### UX
-**Quick check-in** — отметка в 1-2 тапа
-**Home screen widgets**
-**Dark mode**
-**Offline mode**
### Персонализация
-**Icons/Emoji** для привычек
-**Цветовая кодировка**
-**Categories/Groups**
---
## 🌟 4. Differentiators (уникальные фичи лидеров)
### Habitify — Cross-platform sync
- Бесшовная синхронизация между iOS, Android, Web, Mac, Watch
- Один аккаунт везде — редкость на рынке
### Streaks — Apple Health интеграция
- Автоматическая отметка привычек через HealthKit
- "Walked 10K steps" → автоматически отмечено
- Apple Watch complications
### Habitica — Full RPG gamification
- Аватар, уровни, экипировка, питомцы
- Parties для совместных квестов
- Boss battles зависят от выполнения привычек
- Единственное приложение с глубокой геймификацией
### Fabulous — Science-based coaching
- "Journeys" — пошаговые программы изменений
- Основано на исследованиях Duke University
- Аудио-коучинг и медитации
- Больше похоже на wellness app, чем на трекер
### Loop — Open-source & Privacy
- Полностью бесплатное, нет рекламы
- Данные только локально
- "Habit Score" — уникальная формула силы привычки
- Export в CSV/SQLite
### Atoms — Author brand power
- James Clear (15M+ книг продано)
- Daily Lessons из книги "Atomic Habits"
- Premium positioning ($120/год)
### Way of Life — Flexible streaks
- "Chains" с custom длиной (5 дней подряд, потом перерыв)
- "Red chains" — отслеживание плохих серий
- Journal notes к каждой записи
---
## 🚀 5. Рекомендации для Pulse
### Текущие преимущества Pulse
-**Interval habits** (каждые N дней) — есть не у всех
-**Freeze period** — уникальная фича
-**Backfill** (отметка за прошлые дни) — важно
-**Telegram bot** — уникальная интеграция
-**Утренний/вечерний брифинг** — редкость
-**Tasks + Habits** в одном месте
-**PWA** — работает везде без app store
### Quick Wins (1-2 недели каждая)
| Фича | Сложность | Impact | Почему |
|------|-----------|--------|--------|
| **Home screen widgets** | Medium | High | Must-have, все топы имеют |
| **Dark mode** | Easy | Medium | Ожидаемый стандарт |
| **Улучшенная статистика** | Medium | High | Графики, calendar heatmap |
| **Streak badges/rewards** | Easy | Medium | Простая геймификация |
| **Categories/Groups** | Easy | Medium | Организация привычек |
| **Emoji picker** | Easy | Low | UX улучшение |
### Для конкуренции с топами (1-3 месяца)
| Фича | Сложность | Impact | Референс |
|------|-----------|--------|----------|
| **Native iOS app** | High | Very High | Streaks, Done |
| **Native Android app** | High | Very High | HabitNow, Loop |
| **Apple Watch / WearOS** | High | Medium | Streaks, Habitify |
| **Apple Health / Google Fit** | Medium | High | Streaks — автоотметка |
| **Cloud sync** | Medium | High | Habitify |
| **Onboarding flow** | Medium | High | Fabulous — лучший |
| **Export (CSV/JSON)** | Easy | Medium | Loop, Way of Life |
### Уникальные фичи (не делает никто или почти никто)
| Идея | Конкуренты | Potential |
|------|------------|-----------|
| **Telegram-first трекер** | Никто | 🔥 Huge — уникальная ниша |
| **AI habit suggestions** | Atoms (примитивно) | High — персонализация |
| **Voice check-in** (голосовые сообщения) | Никто | Medium — accessibility |
| **Habit templates marketplace** | Никто полноценно | Medium |
| **Family/Team habits** | Habitica (parties) | Medium — accountability |
| **Smart scheduling** (AI) | Reclaim.ai (calendar) | High — но сложно |
| **Habit chains** (привычки зависят друг от друга) | Никто | Medium |
| **Location-based triggers** | Некоторые примитивно | Medium |
| **Mood correlation** | Way of Life (notes) | Medium — insights |
### Модель монетизации для Pulse
**Рекомендуемая стратегия:**
```
FREE TIER:
├── До 5 привычек
├── До 10 задач
├── Базовая статистика
├── Telegram бот (уведомления)
└── PWA доступ
PREMIUM ($4.99/мес или $29.99/год):
├── Unlimited привычки и задачи
├── Расширенная статистика (графики, heatmaps)
├── Widgets (когда будут)
├── Custom themes
├── Export данных
├── Priority support
└── Утренний/вечерний брифинг (AI-улучшенный)
LIFETIME: $49.99 (launch price $29.99)
```
**Почему эта модель:**
- Цена ниже Habitify ($35/год) и Productive ($35/год)
- Конкурентна с HabitNow ($12 lifetime)
- Telegram-first = низкие costs = можно быть дешевле
- Lifetime привлекает early adopters
---
## 📈 Roadmap предложение
### Phase 1: Foundation (Q1 2026)
- [ ] Dark mode
- [ ] Улучшенная статистика (графики)
- [ ] Calendar heatmap view
- [ ] Categories для привычек
- [ ] Export CSV
### Phase 2: Engagement (Q2 2026)
- [ ] Streak badges и rewards
- [ ] PWA widgets (если поддержка браузеров улучшится)
- [ ] Onboarding flow
- [ ] Telegram inline buttons (quick check-in)
### Phase 3: Growth (Q3 2026)
- [ ] Native iOS app
- [ ] Apple Health integration
- [ ] Apple Watch app
- [ ] Premium tier launch
### Phase 4: Differentiation (Q4 2026)
- [ ] AI habit suggestions
- [ ] Native Android app
- [ ] Google Fit integration
- [ ] Habit templates library
---
## 🎯 Ключевые выводы
1. **Рынок насыщен**, но большинство приложений похожи
2. **Telegram-интеграция** — уникальное преимущество Pulse
3. **Freeze period** и **interval habits** — сильные дифференциаторы
4. **Must-have**: widgets, dark mode, лучшая статистика
5. **Native apps** важны для mainstream, но PWA достаточно для MVP
6. **Freemium модель** работает лучше всего
7. **$30-40/год** — sweet spot для подписки
8. **Gamification** работает для узкой аудитории (Habitica)
9. **Cross-platform sync** — killer feature для серьёзных пользователей
10. **Apple Health автоотметка** — wow-фактор для iOS пользователей
---
*Документ подготовлен на основе анализа 10 приложений, публичных обзоров, и данных app store на февраль 2026.*

View File

@@ -0,0 +1,352 @@
# Cosmo & Люся — Голосовой ассистент дома
> Дорожная карта: от теста на маке до продакшн-системы
> Обновлено: 2026-04-11
---
## Текущий статус
| Компонент | Статус |
|-----------|--------|
| Два Gateway (Cosmo :18789, Люся :18790) | ✅ Работает |
| systemd units для обоих | ✅ Настроены |
| Telegram боты раздельные | ✅ Работает |
| Workspace и память перенесены | ✅ Готово |
| MacBook нода подключена | ✅ К Cosmo |
| Wake words | ✅ "космо", "cosmo" |
| TTS Cosmo | ✅ DmitryNeural (муж.) |
| TTS Люся | ✅ SvetlanaNeural (жен.) |
| ElevenLabs | ❌ Не настроен |
| Home Assistant skill | ❌ Не создан |
| Pi satellite | ❌ Не начато |
---
## Фаза 1 — Тест голоса на MacBook (сейчас)
### Что работает
- MacBook подключён как нода к Cosmo Gateway (:18789)
- Wake word "космо" активирует голосовой ввод
- Apple Speech распознаёт русскую речь локально (быстро)
- TTS через Microsoft Edge — DmitryNeural
### Чек-лист
- [ ] Сказать "Космо" → звук активации
- [ ] Голосовой вопрос → голосовой ответ
- [ ] Проверить что сессия создалась под agent `main`
- [ ] Telegram Светы работает параллельно через Люсю (:18790)
### Известные ограничения
- Android voice wake **отключен** (только ручной микрофон)
- Нет нативного Linux companion app (только headless node host)
- Нельзя маршрутизировать voice vs text на разные модели нативно
---
## Фаза 2 — Уникальные голоса (ElevenLabs)
### Зачем
Microsoft Edge TTS звучит нормально (7/10), но:
- Нельзя клонировать/создать уникальный голос
- Ограниченная выразительность
- Нет контроля стиля и эмоций
### Сравнение провайдеров
| Провайдер | Задержка | Качество | Цена | Кастомный голос |
|-----------|----------|----------|------|-----------------|
| Microsoft Edge (сейчас) | ~300ms | 7/10 | Бесплатно | ❌ Только пресеты |
| ElevenLabs | ~500ms | 10/10 | $5/мес | ✅ Клонирование |
| OpenAI TTS | ~400ms | 9/10 | $15/1M chars | ❌ Только пресеты |
| Silero (локально) | ~100ms | 6/10 | Бесплатно | ❌ |
### Рекомендация: ElevenLabs
**Почему:** Лучшее качество + можно создать уникальные голоса для Cosmo и Люси.
**План $5/мес (Starter):**
- 30,000 символов/мес (~15 мин речи)
- До 10 кастомных голосов
- Instant Voice Cloning
- Multilingual v2 модель (русский ✅)
### Конфиг для Cosmo
```json
{
"messages": {
"tts": {
"auto": "inbound",
"provider": "elevenlabs",
"elevenlabs": {
"apiKey": "<ELEVENLABS_API_KEY>",
"voiceId": "<cosmo-voice-id>",
"modelId": "eleven_multilingual_v2",
"stability": 0.5,
"similarityBoost": 0.75,
"style": 0.0,
"useSpeakerBoost": true,
"speed": 1.0,
"languageCode": "ru"
}
}
}
}
```
### Конфиг для Люси
То же самое, но с другим `voiceId` — женский голос.
### Как создать кастомные голоса
1. Зарегистрироваться на elevenlabs.io
2. Voice Lab → Add Generative or Cloned Voice
3. Для клонирования: загрузить ~1 мин чистого аудио
4. Скопировать Voice ID из настроек голоса
5. Обновить `openclaw.json` обоих инстансов
### Фоллбэк
Оставить Microsoft Edge TTS как запасной — если ElevenLabs недоступен или лимит исчерпан.
### Продвинутые возможности
В ответах можно менять голос на лету:
```
[[tts:voiceId=XXXXX stability=0.3 speed=1.2]]
Текст с другим голосом
```
---
## Фаза 3 — Оптимизация скорости
### Узкие места (по порядку задержки)
| Этап | Текущая задержка | Оптимизация |
|------|-----------------|-------------|
| STT (речь→текст) | ~200ms (Apple Speech) | ✅ Уже быстро |
| Сеть (MacBook→Gateway) | ~10ms (LAN) | ✅ Уже быстро |
| LLM ответ | ~2-5 сек (через proxy) | 🔧 Haiku для голоса |
| TTS (текст→речь) | ~300ms (Edge) / ~500ms (ElevenLabs) | Приемлемо |
| **Итого** | **~3-6 сек** | **Цель: <2 сек** |
### Стратегия ускорения
**1. Модель для голосовых сессий**
- Сейчас: `claude-code-proxy` (проксирует через Claude Code CLI → медленно)
- Для голоса лучше: `anthropic/claude-haiku-4-5` напрямую — в 3-5x быстрее
- OpenClaw не может автоматически различать voice vs text
- **Решение:** В SOUL.md добавить правило — голосовые ответы короткие (2-3 предложения)
- **Альтернатива:** Для критичной скорости — отдельный binding для ноды с override модели
**2. Короткие ответы для голоса**
Добавить в SOUL.md:
```
## Голосовые ответы
Если сообщение пришло от ноды (не Telegram): отвечай максимально кратко.
- 1-3 предложения для простых вопросов
- Не используй markdown, списки, таблицы — только текст
- Числа произноси словами когда уместно
```
**3. Streaming TTS**
OpenClaw поддерживает streaming для Telegram (`streaming: "partial"`). Для голосовых ответов streaming не применяется — ответ генерируется целиком, потом озвучивается. Это ОК для коротких ответов.
---
## Фаза 4 — Raspberry Pi Satellite
### Архитектура
```
Комната Сервер (N100, 192.168.31.103)
┌─────────────────────┐ ┌──────────────────────────────┐
│ Raspberry Pi 5 │ │ Gateway :18789 (Cosmo) │
│ │ WS/LAN │ Gateway :18790 (Люся) │
│ USB микрофон ───► │─────────►│ │
│ OpenClaw node host │ │ Claude Haiku/Sonnet │
│ (headless) │◄─────────│ ElevenLabs TTS │
│ │ аудио │ Web search, exec, memory │
│ ▼ │ │ Home Assistant API │
│ BT колонка Алиса │ │ │
└─────────────────────┘ └──────────────────────────────┘
```
### Проблема: нет нативного Linux companion app
OpenClaw companion apps есть только для macOS, iOS, Android. На Linux доступен только **headless node host** (`openclaw node run`), который:
- ✅ Подключается к Gateway по WebSocket
- ✅ Выполняет `system.run` команды
-**Не имеет** STT/TTS/Voice Wake функционала
### Варианты решения для Pi
#### Вариант A: Кастомный satellite скрипт (Python)
**Плюсы:** Полный контроль, можно два wake word на одном Pi
**Минусы:** Нужно писать и поддерживать код, Porcupine платный для кастомных слов
Компоненты:
- **Wake word:** Picovoice Porcupine ($5/мес за кастомные ключевые слова)
- Бесплатно: "пикомон", "терминус" и другие встроенные (русских нет)
- Платно: кастомные "космо", "люся" на русском
- Альтернатива: openWakeWord (бесплатно, но хуже качество на русском)
- **STT:** faster-whisper `small` на CPU (~2-3 сек на Pi 5) или Groq Whisper API (~300ms, нужен интернет)
- **Gateway API:** HTTP POST на OpenClaw Gateway
- **TTS:** Получаем аудио от OpenClaw (ElevenLabs/Edge)
- **Воспроизведение:** aplay через PulseAudio → Bluetooth → Алиса
```python
# Упрощённый цикл:
while True:
if wake_word_detected():
play_activation_sound()
audio = record(seconds=6)
text = transcribe(audio) # faster-whisper или Groq API
response = send_to_openclaw(text) # HTTP API
play_tts(response.audio) # аудио от OpenClaw
```
#### Вариант B: OpenClaw node host + внешний STT/wake
**Плюсы:** Нативная интеграция с Gateway, сессии видны в UI
**Минусы:** Нет готового voice pipeline, нужно дописывать
```bash
# Запуск headless node
openclaw node run --host 192.168.31.103 --port 18789
```
Потом отдельный скрипт слушает микрофон и шлёт текст через `openclaw node send`.
#### Вариант C: Ждать Linux companion app
OpenClaw активно развивается. Возможно появится Linux app с полным voice pipeline. Но это не гарантировано и не скоро.
### Рекомендация: Вариант A (кастомный скрипт)
Самый гибкий. Можно:
- Два wake word ("космо" → :18789, "люся" → :18790) на одном Pi
- Выбрать STT (локальный whisper или облачный Groq)
- Полный контроль над audio pipeline
- Алиса как BT колонка
### Железо
| Компонент | Вариант | Цена |
|-----------|---------|------|
| Raspberry Pi 5 8GB | rpilocator.com | ~$80 |
| USB микрофон | ReSpeaker USB Mic Array (лучше) или любой plug-and-play | 500-3000₽ |
| MicroSD 32GB A2 | Samsung EVO | ~500₽ |
| БП USB-C 27W | Официальный Pi | ~$12 |
| Корпус | Argon ONE v3 (с охлаждением) | ~$25 |
| Колонка | Алиса в BT режиме | уже есть ✅ |
| **Итого** | | ~$130 + 500₽ |
### STT: локальный vs облачный
| Вариант | Задержка | Качество RU | Цена | Офлайн |
|---------|----------|-------------|------|--------|
| faster-whisper small (Pi 5) | ~2-3 сек | 8/10 | Бесплатно | ✅ |
| faster-whisper tiny (Pi 5) | ~1 сек | 6/10 | Бесплатно | ✅ |
| Groq Whisper API | ~300ms | 9/10 | Бесплатно (rate limited) | ❌ |
| OpenAI Whisper API | ~500ms | 9/10 | $0.006/мин | ❌ |
**Рекомендация:** Groq Whisper API (уже настроен в OpenClaw, ключ есть) с фоллбэком на локальный whisper.
---
## Фаза 5 — Home Assistant интеграция
### Что нужно
1. **Long-Lived Token** в Home Assistant
2. **Skill для OpenClaw** — описание API эндпоинтов
3. **Entity ID** для каждого устройства
### Skill файл
```
~/.openclaw/workspace/skills/home-assistant/SKILL.md
```
Содержимое:
- Base URL: `http://<HA_IP>:8123`
- Авторизация: Bearer token
- Основные команды: свет, климат, сцены, сенсоры
- Entity map: человекочитаемые имена → entity_id
### Голосовые команды (примеры)
- "Космо, включи свет в гостиной" → `POST /api/services/light/turn_on`
- "Космо, какая температура дома" → `GET /api/states/sensor.temperature`
- "Космо, включи вечерний режим" → `POST /api/services/scene/turn_on`
### Когда делать
После переезда в квартиру (Q3 2026) и установки HA + Aqara устройств.
---
## Фаза 6 — Финальная архитектура
```
MacBook ──────────┐
(wake: "космо") │
iPhone ──────► Gateway :18789 ◄── Telegram (Даниил)
(нода) Cosmo (main)
Claude Haiku/Sonnet
ElevenLabs TTS (муж.)
Pi satellite ──┤
(wake: "космо") │
iPhone Светы ► Gateway :18790 ◄── Telegram (Света)
(нода) Люся (wife)
Claude Haiku
ElevenLabs TTS (жен.)
Pi satellite ──┘
(wake: "люся")
```
### Один Pi — два агента
Можно запустить один Pi с двумя wake words:
- "космо" → HTTP к :18789
- "люся" → HTTP к :18790
Porcupine поддерживает несколько keyword одновременно. Скрипт определяет какой сработал и шлёт запрос на нужный порт.
---
## Порядок действий
### Сейчас (Фаза 1)
- [x] Разделить агентов на два Gateway
- [x] Настроить TTS (разные голоса)
- [ ] Протестировать голос с MacBook
- [ ] Добавить правила коротких ответов в SOUL.md
### Ближайшее (Фаза 2-3)
- [ ] Зарегистрироваться на ElevenLabs
- [ ] Создать/выбрать голоса для Cosmo и Люси
- [ ] Обновить конфиги TTS
- [ ] Протестировать качество и задержку
- [ ] Оптимизировать модель для голоса
### Среднесрочное (Фаза 4)
- [ ] Купить Raspberry Pi 5 + USB микрофон
- [ ] Написать satellite скрипт (Python)
- [ ] Настроить Porcupine wake words
- [ ] Подключить Алису по Bluetooth
- [ ] Протестировать полный pipeline
- [ ] Автозапуск через systemd
### После переезда (Фаза 5-6)
- [ ] Настроить Home Assistant
- [ ] Создать HA skill
- [ ] Полная голосовая система дома
---
## Ключевые решения
| Вопрос | Решение | Почему |
|--------|---------|--------|
| TTS провайдер | ElevenLabs ($5/мес) | Лучшее качество + кастомные голоса |
| STT на Pi | Groq API + whisper фоллбэк | Скорость + надёжность |
| Wake word | Picovoice Porcupine | Лучший для кастомных слов |
| Модель для голоса | Haiku для простых, Sonnet для сложных | Баланс скорости и качества |
| Pi satellite | Кастомный Python скрипт | Полный контроль, два wake word |
| Колонка | Алиса по Bluetooth | Уже есть, хорошее качество звука |