Напиши, что хочешь сделать. Кто с тобой — соберётся в чате этой идеи. Для студентов университетов Германии.
Translation pending
SocialTypeScript · PLpgSQLGitHub @krikshchiunasOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Соцсеть идей для студентов университетов Германии. Next.js 15 + Supabase.
Translation pending
Taken from the repository README
Loading the full README.
Read the full 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.