{"id":50734262,"url":"https://github.com/wo0zz1/power-paint","last_synced_at":"2026-06-10T12:02:06.910Z","repository":{"id":355652768,"uuid":"1207316573","full_name":"Wo0zZ1/Power-Paint","owner":"Wo0zZ1","description":"Web application for online collective drawing","archived":false,"fork":false,"pushed_at":"2026-05-30T11:34:30.000Z","size":13419,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-30T13:12:58.819Z","etag":null,"topics":["access-rules","auth","crdt","docker","email","nextjs","nginx","oidc","postgresql","prisma","react","real-time","ssr","websockets","yjs"],"latest_commit_sha":null,"homepage":"http://power-paint.duckdns.org","language":"Batchfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Wo0zZ1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-10T20:06:58.000Z","updated_at":"2026-05-30T11:34:34.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Wo0zZ1/Power-Paint","commit_stats":null,"previous_names":["wo0zz1/power-paint"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Wo0zZ1/Power-Paint","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wo0zZ1%2FPower-Paint","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wo0zZ1%2FPower-Paint/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wo0zZ1%2FPower-Paint/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wo0zZ1%2FPower-Paint/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Wo0zZ1","download_url":"https://codeload.github.com/Wo0zZ1/Power-Paint/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wo0zZ1%2FPower-Paint/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34151276,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["access-rules","auth","crdt","docker","email","nextjs","nginx","oidc","postgresql","prisma","react","real-time","ssr","websockets","yjs"],"created_at":"2026-06-10T12:02:00.938Z","updated_at":"2026-06-10T12:02:03.722Z","avatar_url":"https://github.com/Wo0zZ1.png","language":"Batchfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🎨 Power Paint - Real-Time Collaborative Drawing App\n\n\u003e Power Paint - это масштабируемое веб-приложение для совместного рисования в реальном времени, разработанное с использованием современных подходов к построению распределённых систем и фронтенд-архитектуры.\n\n## 🚀 Основные возможности\n\n- Совместное рисование в реальном времени\n- Мгновенная синхронизация через WebSocket\n- Консистентность данных с использованием CRDT движка\n- Поддержка и полный контроль мультипользовательских сессий\n- Интеграция безопасной аутентификации через OpenID Connect\n- Темизация и интернационализация интерфейса\n- Полный стек тестирования, включая E2E тесты\n- Email-рассылки с кодами подтверждения\n- Адаптивный интерфейс\n\n## 🏗 Архитектура\n\nПроект построен как **монорепозиторий**, включающий несколько независимых сервисов:\n\n```\n- nginx\n- Power-Paint-E2E\n- Power-Paint-Migrator\n- Power-Paint-Socket\n- Power-Paint-Web\n```\n\n## 🧩 Технологический стек\n\n### Frontend\n\n- [React](https://react.dev)\n- [Next.js](https://nextjs.org)\n- [TypeScript](https://www.typescriptlang.org)\n- [Feature-Sliced Design](https://fsd.how)\n- [TailwindCSS](https://tailwindcss.com)\n- [Zustand](https://zustand-demo.pmnd.rs)\n- [React Query](https://tanstack.com/query)\n\n### Backend / Infra\n\n- [Node.js](https://nodejs.org)\n- [WebSocket](https://en.wikipedia.org/wiki/WebSocket)\n- [Yjs](https://yjs.dev)\n- [PostgreSQL](https://www.postgresql.org)\n- [Prisma ORM](https://www.prisma.io)\n\n### [Email](#-email-система)\n\n- [Nodemailer](https://nodemailer.com)\n- [React Email](https://react.email)\n\n### DevOps\n\n- [Nginx](https://www.nginx.com)\n- [Docker](https://www.docker.com)\n- [DuckDNS](https://www.duckdns.org)\n\n### [Testing](#-тестирование)\n\n- [Jest](https://jestjs.io)\n- [Testing Library](https://testing-library.com)\n- [Playwright](https://playwright.dev)\n\n# Быстрый старт\n\n### 📦 1. Клонирование репозитория\n\n```bash\ngit clone --recurse-submodules https://github.com/Wo0zZ1/Power-Paint\n```\n\n### ⚙️ 2. Настройка переменных окружения\n\nCкопируй и заполни корневой `.env` файл.\n\n```bash\ncp .env.example .env\n```\n\n\u003e TIP: Если же хочешь запускать сервисы по отдельности, то переменные окружения для каждого сервиса находятся в соответствующих папках (например, `Power-Paint-Web/.env`).\n\n### 🐋 3. Запуск в Docker\n\nДля запуска всех сервисов в продакшн-режиме:\n\n```bash\ndocker compose -f docker-compose.yml --env-file .env up -d --build\n```\n\nДля запуска системы в dev-режиме и дальнейшей разработки фронтенда, развёрнутого на localhost:\n\n```bash\ndocker compose -f docker-compose.web-dev.yml --env-file .env.dev up -d --build\n```\n\nДля запуска E2E тестов:\n\n```bash\n./run-e2e-tests.sh\n```\n\n\u003e TIP: Если хочешь запустить E2E тесты в Windows, используй `run-e2e-tests.bat`.\n\n## 🧪 Тестирование\n\n### Unit + Integration\n\nЗапуск внутри `Power-Paint-Web`:\n\n```bash\nyarn test\n```\n\n### E2E тесты\n\nЗапуск из корневой директории монорепозитория:\n\n\u003e Linux / MacOS:\n\n```bash\n./run-e2e-tests.sh\n```\n\n\u003e Windows:\n\n```bat\nrun-e2e-tests.bat\n```\n\n## 🌐 Деплой\n\nВся инфраструктура веб-приложения развёрнута на [VPS](https://beget.com/ru)\n\n### Let's Encrypt SSL сертификаты\n\nДля обеспечения безопасности и шифрования данных используется SSL-сертификат от Let's Encrypt.\n\n## 📂 Структура `Power-Paint-Web`\n\nСтруктура фронтенд-приложения построена по принципам Feature-Sliced Design, что обеспечивает высокую масштабируемость и поддерживаемость кода.\n\n```\n.\n├── app/          # Роутинг и инициализация\n├── email/        # Шаблоны для email-рассылок\n├── public/       # Статические ресурсы\n└── src/\n    ├── app       # Глобальные провайдеры\n    ├── entities  # Доменные сущности\n    ├── features  # Бизнес-логика\n    ├── shared    # Общие утилиты и UI-kit\n    └── widgets   # Композиция UI\n```\n\nРоутинг реализован с помощью [App Router](https://nextjs.org/docs/app) и вынесен в отдельный слой `/app`, что позволяет легко управлять навигацией и поддерживать чистую архитектуру, не смешивая логику со слоем `/src/app`\n\n## 📬 Email-система\n\nPower Paint включает в себя встроенную систему email-рассылок, которая используется для отправки кодов подтверждения при регистрации и других уведомлений. Основные компоненты системы включают:\n\n- Шаблоны email, разработанные с помощью [React Email](https://react.email), что позволяет создавать адаптивные и красивые письма.\n- Отправка писем осуществляется через SMTP-сервер с помощью [Nodemailer](https://nodemailer.com), обеспечивая надёжную доставку сообщений пользователям.\n\n\u003e TIP: Для E2E тестирования поднимается отдельный сервис [MailHog](https://github.com/mailhog/MailHog), который перехватывает все исходящие письма и позволяет просматривать их через веб-интерфейс, что обеспечивает удобное тестирование email-функционала без риска отправки реальных писем.\n\n## Почему Power Paint?\n\n\u003e Power Paint - это не просто ещё одно приложение для рисования, а полноценная платформа для совместной работы, которая решает ключевые проблемы существующих решений на рынке. Вот почему Power Paint выделяется:\n\n| Аналог     | Ограничение             | Преимущества Power Paint                |\n| ---------- | ----------------------- | --------------------------------------- |\n| Excalidraw | Нет ролевой модели      | Полный контроль над сессиями            |\n| Draw.io    | Медленная синхронизация | Мгновенная синхронизация                |\n| Figma      | Проприетарность         | Открытый код и возможность кастомизации |\n\n| Use case / сценарий                          | Power Paint | Excalidraw | Draw.io | Figma |\n| -------------------------------------------- | ----------- | ---------- | ------- | ----- |\n| Быстрые скетчи и идеи                        | ✅          | ✅         | ⚠️      | ⚠️    |\n| Совместное редактирование в реальном времени | ✅          | ✅         | ⚠️      | ✅    |\n| Работа в распределённых командах             | ✅          | ⚠️         | ⚠️      | ✅    |\n| Контроль доступа (роли, права)               | ✅          | ⚠️         | ⚠️      | ✅    |\n| развёртывание на своей инфраструктуре        | ✅          | ✅         | ✅      | ❌    |\n| Использование в обучении / преподавании      | ✅          | ✅         | ⚠️      | ⚠️    |\n| Brainstorming / whiteboard-сессии            | ✅          | ✅         | ⚠️      | ⚠️    |\n\n👉 Power Paint:\n\n- Open-source\n- Масштабируемый\n- Контролируемый стек\n- Подходит для enterprise\n\n## Демо\n\n### Регистрация\n\n#### Страница регистрации, Шаг 1: Ввод email и отправка кода подтверждения\n\n![Регистрация](./docs/assets/signup_step1.png)\n\n#### Страница регистрации, Шаг 2: Ввод дополнительных данных и завершение регистрации\n\n![Регистрация](./docs/assets/signup_step2.png)\n\n#### Страница регистрации, Шаг 3: Ввод кода подтверждения из email\n\n![Регистрация](./docs/assets/signup_step3.png)\n\n### Восстановление пароля\n\n#### Страница восстановления пароля, Шаг 1: Ввод email и отправка кода подтверждения\n\n![Восстановление пароля](./docs/assets/reset-password_step1.png)\n\n#### Страница восстановления пароля, Шаг 2: Ввод кода подтверждения из email\n\n![Восстановление пароля](./docs/assets/reset-password_step2.png)\n\n#### Страница восстановления пароля, Шаг 3: Ввод нового пароля и завершение процесса\n\n![Восстановление пароля](./docs/assets/reset-password_step3.png)\n\n### Вход\n\n#### Страница входа: Ввод email и пароля\n\n![Вход](./docs/assets/signin.png)\n\n### Главная страница\n\n#### Тёмная тема + Интернационализация (английский язык)\n\n![Главная страница](./docs/assets/dashboard_dark_en.png)\n\n#### Светлая тема + Интернационализация (русский язык)\n\n![Главная страница](./docs/assets/dashboard_light_ru.png)\n\n#### Настройка доступа к рабочей области\n\n![Настройка доступа](./docs/assets/share-workspace.png)\n\n### Email-рассылки\n\n#### Пример письма с кодом подтверждения для регистрации\n\n![Email](./docs/assets/registration_email-code.png)\n\n#### Пример письма с кодом подтверждения для восстановления пароля\n\n![Email](./docs/assets/forgot-password_email-code.png)\n\n### Рисование\n\n#### Совместное рисование в реальном времени\n\n![Рисование](./docs/assets/board.png)\n\n### Тестирование\n\n#### Unit\u0026Integration-тесты\n\n![Unit\u0026Integration](./docs/assets/unit\u0026integration-tests.png)\n\n#### E2E-тесты\n\n![E2E](./docs/assets/e2e-tests.png)\n\n#### Lighthouse отчёт\n\n![Lighthouse](./docs/assets/lighthouse-stats.png)\n\n#### Lighthouse метрики\n\n![Lighthouse метрики](./docs/assets/lighthouse-metrics.png)\n\n## 📄 Лицензия\n\nПроект распространяется под лицензией [MIT](LICENSE)\n\n---\n\nРазработано в рамках курсовой работы 2026\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwo0zz1%2Fpower-paint","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwo0zz1%2Fpower-paint","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwo0zz1%2Fpower-paint/lists"}