Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Соцсеть идей для студентов университетов Германии. Next.js 15 + Supabase.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Социальная сеть для студентов университетов Германии, построенная вокруг одной единицы — идеи.
Человек пишет, что хочет сделать: «Пиво у канала после занятий», «Учебная группа по анализу перед экзаменом», «Фотопрогулка на рассвете». У идеи есть время, место и число мест. Остальные заходят в групповой чат этой идеи и договариваются там.
Это не лента и не мэтчинг. Это инструмент, чтобы найти людей через конкретную активность: не «кто рядом похож на меня», а «кто идёт в шесть на скалодром». Поэтому лента — расписание, а не поток: обе вкладки строго по времени, ближайшее первым, и идея уходит из ленты, когда автор закрыл набор или прошёл час после начала. Чат при этом остаётся — всем, кто в нём был.
Интерфейс — русский, обращение на «ты». Термины — по глоссарию в
docs/ui-contract.md, отклоняться нельзя.
Продакшен: https://to-get-there-mu.vercel.app — выкатывается сам из
main после зелёного CI.
app/globals.css, контраст WCAG AAНужен Node 20 или новее (проверено на 24).
npm install
cp .env.local.example .env.local
npm run dev
http://localhost:3000. С NEXT_PUBLIC_USE_MOCKS=true всё работает из
lib/mock — без базы и без входа (демо-режим, запись не сохраняется).
С базой: NEXT_PUBLIC_USE_MOCKS=false и ключи проекта Supabase, либо
локальный стек supabase start (нужен Docker).
| Команда | Что |
|---|---|
npm run lint | ESLint без предупреждений |
npm run typecheck | TypeScript strict |
npm test | юнит-тесты (Vitest) |
npm run test:e2e | все экраны в браузере, axe (WCAG 2.2 AA), клавиатура, телефон (Playwright) |
npm run test:db | права и триггеры в базе (pgTAP), нужен supabase start |
npm run test:e2e:live | со входом на локальной Supabase: регистрация с письмом, вход, сброс пароля, права, realtime у двоих |
psql … -f supabase/perf/load.sql | нагрузочный прогон: десятки тысяч строк, планы запросов, бюджет времени (docs/PERFORMANCE.md) |
Локально E2E можно гонять установленным Chrome, без скачивания браузера:
PLAYWRIGHT_CHANNEL=chrome npm run test:e2e.
CI (.github/workflows) на каждый push и pull request: линт, юнит,
сборка, типы, аудит зависимостей, E2E на десктопе и телефоне, E2E со входом
на локальной Supabase, все миграции с нуля + pgTAP + нагрузочный прогон +
линт схемы, CodeQL. Как изменения схемы доходят до прода —
docs/STAGING.md.
Полный список с пояснениями — .env.local.example. Коротко:
| Переменная | Где | Зачем |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY | везде | клиент Supabase (защищён RLS) |
NEXT_PUBLIC_USE_MOCKS | везде | true — демо без базы |
NEXT_PUBLIC_SITE_URL | прод | адрес для ссылок в письмах (иначе — домен Vercel) |
SUPABASE_SECRET_KEY, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET | только сервер | проверка личности |
LEGAL_OPERATOR_* | прод | Impressum (docs/LEGAL.md) |
app/
(app)/ экраны приложения (после входа)
(feed)/ лента: ?tab=following | ?tab=university
create/ post/[id]/ post/[id]/edit/
u/[nickname]/ messages/ search/ notifications/ settings/
auth/ вход, регистрация, подтверждение почты, сброс пароля
legal/ Impressum, конфиденциальность, условия, правила
actions/ server actions — вся запись
api/ health, выгрузка данных, вебхук Stripe
components/
ui/ примитивы: кнопки, поля, листы, иконки, аватары
chat/ dm/ feed/ profile/ search/ create/ settings/ safety/ legal/
lib/
data/ чтение из Supabase (с RLS); index.ts — переключатель моков
actions/actor.ts кто действует, ошибки словами
validate.ts проверка аргументов server actions
csp.ts Content-Security-Policy с nonce
live.ts use-presence.ts realtime: сигналы, «печатает», присутствие
types.ts format.ts … домен и чистые правила (с юнит-тестами)
mock/ демо-данные
supabase/
migrations/ 0001…0043 — схема, RLS, триггеры, cron
tests/database/ pgTAP: права и триггеры
perf/ нагрузочный прогон: данные, запросы, бюджеты
seed.sql config.toml
e2e/ Playwright + axe, демо-данные
e2e-live/ Playwright со входом на локальной Supabase
docs/ см. ниже
| Файл | О чём |
|---|---|
docs/ARCHITECTURE.md | как устроено, куда идут данные, решения |
docs/DATABASE.md | таблицы, политики, функции, миграции |
docs/AUTH.md | вход и аккаунт: архитектура, потоки, меры защиты, лимиты, будущая проверка вуза |
docs/PERFORMANCE.md | нагрузочный прогон: что было медленно, что изменено, цифры до и после |
docs/STAGING.md | стейджинг, правила миграций, порядок выкатки, что делать при сбое |
docs/SECURITY.md | модель угроз, что чем защищено, что сделать руками |
docs/MODERATION.md | как разбирать жалобы (DSA) |
docs/LEGAL.md | Impressum, DSGVO, DSA — что сделано и что за оператором |
docs/ui-contract.md, docs/DESIGN.md | правила экранов, глоссарий, дизайн |
docs/ROADMAP.md | этапы и что дальше |
CONTRIBUTING.md | как вносить изменения |
isInFeed() (lib/format.ts) и в
представлениях active_posts и post_cards — и они обязаны совпадать.follows.