Production: https://tbrain.vercel.app
GitHub: github.com/antonyRock/tbrain (клонировать в папку tbrain)
PWA-чат «второй мозг»: ChatGPT-подобный интерфейс, долговременная память в Supabase PostgreSQL, голосовой ввод, проекты и файлы.
Последний релиз: Beta multi-user & voice update · CHANGELOG
Персональная система памяти на базе ИИ.
Сегодня ChatGPT, Claude и другие ИИ отлично отвечают на вопросы, но плохо работают как долгосрочная память человека.
Пользователь постоянно сталкивается с одними и теми же проблемами:
- информация теряется между десятками чатов;
- приходится заново объяснять контекст;
- документы загружаются, но не становятся частью общей базы знаний;
- идеи и заметки быстро забываются;
- сложно найти обсуждение, которое было месяц назад;
- ИИ отвечает на вопрос, но не накапливает опыт вместе с пользователем.
В результате человек тратит время на восстановление контекста вместо работы.
tBrain — это попытка создать персональный второй мозг.
Система запоминает:
- диалоги;
- документы;
- файлы;
- голосовые заметки;
- проекты;
- задачи;
- важные факты.
И позволяет находить эту информацию обычным языком.
Например:
- «Что мы обсуждали по терминалу T6D?»
- «Найди все документы по INPAS»
- «Покажи решения по проекту Дизайн терминалов»
- «Какие идеи я записывал голосом на прошлой неделе?»
Долговременная память — сохранение знаний между чатами.
Поиск по:
- чатам;
- памяти;
- документам;
- названиям файлов;
- содержимому файлов.
Работа с документами — PDF, Word, Excel, изображения.
Голосовой ввод — транскрибация речи через модели OpenAI.
Проекты — группировка чатов и файлов по проектам.
Несколько пользователей — у каждого пользователя собственные чаты, память, документы и проекты. Данные сейчас изолированы друг от друга, но в целевом виде при работе в команде могут быть общей базой данных команды.
tBrain — это не просто чат.
Цель проекта — создать систему, которая помогает человеку накапливать знания, находить их через годы и использовать накопленный опыт для принятия решений.
- Next.js + TypeScript + App Router — один экран чата, PWA (
manifest.webmanifest, service worker, установка на телефон). - Supabase Auth (beta) — вход по email/паролю, logout, изоляция по
user_id. - Чат — сообщения, ввод, микрофон, drag & drop файлов, кнопка «в конец чата», fullscreen preview изображений.
- Backend API:
POST /api/chat— память → OpenAI → ответ → background memory extractionPOST /api/transcribe— голос → текст (OpenAI, fallback-модель, retry)GET/POST /api/conversations,/api/projects,/api/files,/api/documents,/api/user
- Память —
facts,entities,tasks; retrieval из таблиц + документов; extractor после сообщений. - Проекты — папки для чатов; файлы внутри проектов; поиск по названию и содержимому файлов.
- Excel / PDF / docx — parsing, parsed data в
documents(без base64-картинок в JSON). - Sidebar — проекты, чаты, профиль пользователя, статистика (чаты, слова, активные дни).
- Голос — pending recordings в IndexedDB до успешной транскрибации.
- Profiling — замеры этапов
/api/chat(lib/request-profile.ts).
Таблицы Supabase: messages, facts, entities, tasks, conversations, projects, documents, users.
Базовая схема: supabase/schema.sql. Дополнительные миграции по мере развития:
| Файл | Назначение |
|---|---|
schema.sql |
базовые таблицы |
conversations_migration.sql |
чаты |
projects_migration.sql |
проекты |
document_memory_migration.sql |
документы и память файлов |
multi_user_migration.sql |
user_id, profiles, RLS |
multi_user_repair.sql |
repair legacy placeholder user |
Выполняйте в Supabase → SQL Editor. Для beta multi-user после schema.sql нужен как минимум multi_user_migration.sql.
git clone https://github.com/antonyRock/tbrain.git
cd tbrain
npm install
cp .env.example .env.local
# заполните .env.local (см. ниже)
npm run devОткройте http://localhost:3000.
Сборка production локально:
npm run build
npm startСкопируйте .env.example → .env.local и заполните:
| Переменная | Где используется | Описание |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL |
client + server | URL проекта Supabase |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
client | anon public key (Supabase → Settings → API) |
SUPABASE_SERVICE_ROLE_KEY |
server only | service role key — не добавляйте в клиент |
OPENAI_API_KEY |
server | ключ OpenAI |
OPENAI_CHAT_MODEL |
server | модель чата, по умолчанию gpt-5.5 |
OPENAI_REASONING_EFFORT |
server | для GPT-5: low / medium / high (опционально) |
OPENAI_TRANSCRIPTION_MODEL |
server | основная модель распознавания речи |
OPENAI_TRANSCRIBE_MODEL |
server | alias для transcription provider |
OPENAI_TRANSCRIBE_FALLBACK_MODEL |
server | fallback при ошибке основной модели |
OPENAI_IMAGE_MODEL |
server | модель генерации изображений (опционально) |
Пример минимального .env.local:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...
SUPABASE_SERVICE_ROLE_KEY=eyJ...
OPENAI_API_KEY=sk-...
OPENAI_CHAT_MODEL=gpt-5.5
OPENAI_REASONING_EFFORT=medium
OPENAI_TRANSCRIPTION_MODEL=gpt-4o-transcribe
OPENAI_TRANSCRIBE_MODEL=gpt-4o-transcribe
OPENAI_TRANSCRIBE_FALLBACK_MODEL=gpt-4o-mini-transcribeДобавьте те же переменные в Vercel → tbrain → Settings → Environment Variables, включая NEXT_PUBLIC_SUPABASE_ANON_KEY. Без anon key на production появится экран «Auth не настроен».
Канонический домен: https://tbrain.vercel.app (см. vercel.json).
- В Supabase включите Authentication → Providers → Email (email + password).
- Добавьте в
.env.local:NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEY
- Выполните SQL-миграции multi-user (см. Multi-user).
- Перезапустите dev-сервер:
npm run dev. - Откройте приложение — должен появиться экран входа. После login API получает JWT и фильтрует данные по
user_id.
Клиент: AuthProvider, AuthGate, LoginScreen.
Server: lib/server-auth.ts, lib/request-context.ts — JWT из Authorization: Bearer или ?access_token= (для картинок).
- Authentication → Users → Add user — создайте email + password для каждого beta-тестера.
- Скопируйте User UID из карточки пользователя.
- В SQL Editor добавьте профиль в
public.users:
insert into public.users (id, display_name, tagline)
values (
'00000000-0000-0000-0000-000000000000'::uuid, -- UID из auth.users
'Имя',
'Ты можешь всё!'
)
on conflict (id) do update
set display_name = excluded.display_name, updated_at = now();- Для полной изоляции данных выполните миграции:
supabase/multi_user_migration.sql— основная миграцияuser_id+ RLSsupabase/multi_user_repair.sql— если ранее был placeholder user изusers_migration.sql
Порядок для новой базы: schema.sql → остальные миграции по необходимости → multi_user_migration.sql.
- Запустите приложение на HTTPS или
localhost(микрофон требует secure context). - На iPhone по локальной сети (
http://192.168.x.x) микрофон не работает — используйте tbrain.vercel.app илиnpm run dev:lanс HTTPS-тunnel. - Нажмите иконку микрофона в поле ввода, говорите, отпустите — текст появится после
/api/transcribe. - При ошибке сети запись сохраняется в IndexedDB (
tbrain-voice-recordings) — можно повторить транскрибацию. - Убедитесь, что заданы
OPENAI_API_KEY,OPENAI_TRANSCRIPTION_MODELи при необходимостиOPENAI_TRANSCRIBE_FALLBACK_MODEL.
supabase/multi_user_migration.sql # user_id, backfill, RLS, profiles
supabase/multi_user_repair.sql # repair legacy placeholder user (если нужно)
Таблицы с user_id: conversations, messages, projects, documents, facts, entities, tasks.
- Создайте двух пользователей в Supabase Auth (см. выше).
- Войдите под первым — создайте чат и сообщение.
- Выйдите, войдите под вторым — чаты первого пользователя не должны отображаться.
- Скрипт проверки (нужен
.env.localс service role):
node scripts/verify-multi-user.mjsОжидание: все строки в 7 таблицах принадлежат ожидаемому user_id, профили в public.users на месте.
- Репозиторий: github.com/antonyRock/tbrain
- Vercel-проект: tbrain, ветка
main - Push в
main→ автодеплой на https://tbrain.vercel.app - В Settings → Domains оставьте только
tbrain.vercel.app(удалите старыеchatgpt-*алиасы, если остались)
| Область | Путь |
|---|---|
| UI чата | app/page.tsx |
| Auth | components/AuthProvider.tsx, AuthGate.tsx, LoginScreen.tsx |
| Sidebar / профиль | components/SidebarUserProfile.tsx |
| API | app/api/* |
| Память | lib/memory.ts, lib/chat-post-processing.ts |
| Голос | hooks/useVoiceRecording.ts, lib/voice-recording.ts, lib/transcription.ts |
| SQL | supabase/*.sql |
- Сообщение пользователя сохраняется в
messages(сuser_id). - Backend загружает память из
facts,entities,tasks, документов. - Контекст передаётся в OpenAI.
- Ответ сохраняется; background memory extraction обновляет память асинхронно.
/api/chatподдерживает request profiling (lib/request-profile.ts).
- CHANGELOG.md — история изменений
- RELEASE_NOTES.md — подробности текущего beta-релиза и known issues
См. полный список в docs/RELEASE_NOTES.md#known-issues:
- RLS может включаться отдельным этапом после проверки
user_idfiltering - production env variables нужно добавлять в Vercel вручную
- voice input на iPhone требует HTTPS
- audio recordings хранятся временно до транскрибации
- multi-user требует проверки на тестовых аккаунтах
- Retrieval простой: в основном последние записи из таблиц памяти, без сложного semantic search.
- Extractor не дедуплицирует память агрессивно.
- Экспорт/import памяти ещё не реализованы.
- RLS подготовлен в SQL, но финальное включение — после регрессии
user_idfiltering. - Голос и микрофон на iPhone только по HTTPS.
Эти ограничения осознанны для beta: сначала рабочий продукт для малого круга пользователей, затем усиление памяти и безопасности.