← К портфолио

Personal project · Full-stack · macOS

Letter Box

Self-hosted почтовый клиент для macOS: несколько аккаунтов, фоновая синхронизация и локальные AI-теги без облачных LLM.

01

О проекте

Letter Box собирает Mail.ru, Яндекс и Gmail в одном интерфейсе. Письма синхронизируются по IMAP, хранятся в PostgreSQL, а непрочитанные опционально размечаются локальной моделью через Ollama — без отправки содержимого внешним AI-сервисам.

Синхронизация и обработка живут на сервере: очередь BullMQ + Redis продолжает работать, даже когда desktop-приложение закрыто. Credentials шифруются на сервере, доступ — через JWT с ротацией refresh-токенов.

В UI — единый inbox, вкладки аккаунтов, фильтры по AI-тегам, дашборд с непрочитанными, спамом и динамикой, а также отправка, ответ и пересылка через SMTP.

02

Интерфейс

  • Обзор: аккаунты, непрочитанные, активность и AI-теги
  • Обзор: AI-теги по категориям, спам и сводка Ollama
  • Входящие с фильтрами по AI-тегам и просмотром письма
  • Входящие: просмотр письма с вложением
  • Создание нового письма
  • Важные письма по всем аккаунтам
  • Обзор в светлой теме

03

Что умеет

  • Несколько аккаунтов

    Mail.ru, Яндекс и Gmail в одном окне: вкладки, единый inbox и фильтры по непрочитанным и AI-тегам.

  • Фоновая синхронизация

    BullMQ + Redis обновляют папки на сервере, даже если desktop закрыт.

  • Полный почтовый цикл

    Получение по IMAP, отправка/ответ/пересылка по SMTP, флаги, архив, перемещение и удаление.

  • Локальный AI

    Ollama размечает непрочитанные письма локально — без облачных AI API.

  • Дашборд

    Непрочитанные, важные, активность по дням, распределение по аккаунтам и тегам.

  • Self-hosted

    PostgreSQL, Redis и worker поднимаются через Docker; данные остаются у вас.

04

Ключевые решения

  • Сервер владеет почтой

    IMAP/SMTP и хранение вынесены из Electron в NestJS. Клиент не держит долгие соединения и не хранит пароли приложений локально.

  • Очередь вместо «синк в UI»

    Фоновый worker обновляет папки и запускает AI-разметку независимо от жизни окна приложения.

  • Локальный AI по желанию

    Ollama подключается опционально. Если модели нет, клиент остаётся полноценным почтовым клиентом без тегов.

  • Общие контракты

    DTO и события вынесены в пакет `@letter-box/contracts`, чтобы desktop и server говорили на одном языке.

05

Архитектура

ElectronNestJS APIRedis + BullMQSync / AIWorkerIMAP / SMTPPostgreSQLOllama
Electron подключается к NestJS API. API пишет в Redis + BullMQ и PostgreSQL. Очередь запускает Sync / AI Worker, который работает с IMAP / SMTP и Ollama.

Electron + React ходит в NestJS по REST и Socket.IO. API пишет в PostgreSQL и ставит задачи в Redis/BullMQ; worker синхронизирует почту по IMAP/SMTP и при необходимости вызывает Ollama.

06

Технологии

  • TypeScript
  • Electron
  • React
  • Vite
  • Mantine
  • TanStack Query
  • NestJS
  • Prisma
  • PostgreSQL
  • Redis
  • BullMQ
  • Socket.IO
  • imapflow
  • nodemailer
  • Ollama
  • Docker