Fields & Floors Collectors
Search every numbered sports card on eBay by print run, autograph, rookie status and price, then save searches and get an email when a new card lists.
Translation pending
Онлайн-примерка очков, Face-fit score и структурированная база знаний по выбору оправы.
Translation pending
CommerceTypeScript · PLpgSQLGitHub @nikv98402-commitsOnlineOwner 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
Loading the full README. The saved excerpt is shown below.
Интернет-магазин оптики на React, TypeScript, Vite и Tailwind CSS. После успешного GitHub Actions деплоя демо должно открываться как обычный сайт: Ссылку можно открыть прямо на iPhone в Safari/Chrome — ничего устанавливать не нужно. Fallback GitHub Pages URL после перехода на корневой custom domain может не работать как /optica-shop/, потому что Vite собирает ассеты для корня домена. 1. В настройках DNS домена vilu.store добавить A-записи для apex-домена:Read the full README ↗
Интернет-магазин оптики на React, TypeScript, Vite и Tailwind CSS.
После успешного GitHub Actions деплоя демо должно открываться как обычный сайт:
Ссылку можно открыть прямо на iPhone в Safari/Chrome — ничего устанавливать не нужно.
Fallback GitHub Pages URL после перехода на корневой custom domain может не работать как /optica-shop/, потому что Vite собирает ассеты для корня домена.
vilu.store добавить A-записи для apex-домена:@ A 185.199.108.153
@ A 185.199.109.153
@ A 185.199.110.153
@ A 185.199.111.153
www.vilu.store добавить CNAME:www CNAME nikv98402-commits.github.io
Settings -> Pages.Build and deployment выбрать GitHub Actions, если еще не выбрано.Custom domain указать:vilu.store
Enforce HTTPS, когда GitHub выпустит сертификат.main или вручную запустить workflow Deploy demo to GitHub Pages.Файл public/CNAME добавлен как явный артефакт домена и fallback для статической публикации, но при деплое через GitHub Actions домен все равно нужно сохранить в Settings -> Pages -> Custom domain. Vite настроен на base: '/', потому что сайт будет жить в корне https://vilu.store/, а не в подпапке /optica-shop/.
src/data/opticsDirectory.ts без API-ключей и backend.Сегодня -> Результат -> Направление, восстановление черновика после перезагрузки и безопасный следующий шаг без постановки диагноза.Новые рабочие пространства доступны только при настроенном Supabase и явном включении двух уровней rollout: глобального VITE_FEATURE_VILU_FOUNDATION / соответствующего VITE_FEATURE_VILU_* и одноимённого флага активной организации. Маршрут всегда содержит locale и стабильный organizationId:
/:locale/organizations/:organizationId/employee/today
/:locale/organizations/:organizationId/employee/screenings/:screeningId/result
/:locale/organizations/:organizationId/employee/referrals/:referralId
/:locale/organizations/:organizationId/employee/passport
/:locale/organizations/:organizationId/employee/profile
/:locale/organizations/:organizationId/employer/outcomes
/:locale/organizations/:organizationId/provider/queue
Соответствие переменных и ключей организации: VITE_FEATURE_VILU_AUTH_V2 → vilu_auth_v2, VITE_FEATURE_VILU_EMPLOYEE_FLOW_V2 → vilu_employee_flow_v2, VITE_FEATURE_VILU_PROVIDER_QUEUE_V2 → vilu_provider_queue_v2, VITE_FEATURE_VILU_PASSPORT_PROFILE_V2 → vilu_passport_profile_v2, VITE_FEATURE_VILU_EMPLOYER_OUTCOMES_V2 → vilu_employer_outcomes_v2.
Проверка роли, feature flag и данных выполняется для одной активной организации. Пользователь без активного членства не получает доступ к чужому workspace. Миграция находится в supabase/migrations/20260819090000_create_vilu_identity_foundation.sql, а локальные allowed/denied проверки RLS запускаются через npm run test:rls.
Slice 1 реализует только маршрут сотрудника под vilu_employee_flow_v2:
/:locale/organizations/:organizationId/employee/today
/:locale/organizations/:organizationId/employee/screenings/:screeningId/result
/:locale/organizations/:organizationId/employee/referrals/:referralId
Черновик скрининга, завершённый результат и направление всегда связаны с activeOrganizationId и текущим сотрудником. Прогресс сохраняется идемпотентным RPC и восстанавливается после перезагрузки; направление создаётся атомарно и идемпотентно. После передачи в клинику карточка направления и Vision Passport показывают текущий provider workflow status и дату созданной записи, а не устаревший срок ответа. Работодатель, другой сотрудник и участник другой организации не могут читать эти данные. Основной контракт находится в supabase/migrations/20260819130000_create_vilu_employee_care_flow.sql, а owner-scoped чтение provider progress — в supabase/migrations/20260902140000_expose_employee_referral_progress.sql.
Slice 2 добавляет отдельные Vision Passport и Profile под флагом vilu_passport_profile_v2. Контракт находится в supabase/migrations/20260820120000_create_vilu_passport_profile.sql, а интеграционные проверки — в supabase/tests/passport_profile_rls.test.sql. Доступ ограничен активной организацией сотрудника; работодатель не получает персональные медицинские данные, а клинический партнёр получает доступ только при действующем согласии и organization_type=provider.
Slice 3 реализует Employer Outcomes под vilu_employer_outcomes_v2 и Provider Queue под vilu_provider_queue_v2. Employer Outcomes возвращает только зафиксированные завершённые UTC-месяцы и агрегаты одной когорты screening -> referral -> outcome; малые ячейки, производные ставки и дополняющие ячейки скрываются, чтобы нельзя было восстановить индивидуальные медицинские события сравнением соседних отчётов. Provider Queue доступен только участнику активной provider-организации при действующем clinic_access consent и поддерживает очередь, приоритет/SLA, запись, срочную эскалацию, документы и подтверждение результата. Чувствительные чтения и изменения аудитируются без помещения клинического содержимого в audit metadata; мутации используют optimistic locking и идемпотентные ключи, включая конкурентные повторы.
Основной контракт Slice 3 находится в supabase/migrations/20260821120000_create_vilu_employer_provider_operations.sql, а безопасный порядок удаления новых дочерних записей — в supabase/migrations/20260821130000_harden_vilu_slice3_deletion.sql. RLS, privacy, deletion и двухсессионная конкурентность покрыты файлами supabase/tests/employer_provider_operations_rls.test.sql, supabase/tests/employer_provider_deletion.test.sql и supabase/tests/provider_operations_concurrency.test.sql.
Единая матрица ролей, маршрутов, флагов, миграций, production rollout,
rollback и canary-проверок находится в
docs/deployment/vilu-workspaces.md.
Правильный сценарий перед релизом:
Найти оптику рядом.Это не классический лид и не справочник оптик. Это intent-сигнал после персонального подбора: пользователь уже понял, какие оправы ему подходят, и выбирает точку для финальной примерки.
Фото остается в браузере и не отправляется на сервер. Checkout подготовки визита собирает необязательное имя, выбранный канал связи, контакт и явное согласие, после чего submit-visit-lead сохраняет заявку и 1-3 выбранные оправы в Supabase. Контакт не записывается в browser storage, URL, clipboard fallback или аналитику.
После успешной заявки браузер хранит в sessionStorage только технический контекст попытки: leadId, короткоживущий paymentCapabilityToken, idempotency key и timestamp безопасного черновика. Имя, контакт, фото, рецепт и медицинские данные туда не попадают.
Текущая реализация поддерживает этот сценарий через переменную окружения:
VITE_TALLY_FORM_URL=https://tally.so/r/FORM_ID
Для GitHub Pages задайте это как Repository variable: Settings → Secrets and variables → Actions → Variables → New repository variable → VITE_TALLY_FORM_URL.
Если VITE_TALLY_FORM_URL задана, Tally используется как резервная форма при недоступном backend или смешанной версии frontend/backend. В URL передаются только безопасные prefill-параметры: город, способ связи, цель, количество и названия оправ, источник. Имя и контакт пользователь вводит повторно уже в форме; фото, рецепт, жалобы, точная геолокация и параметры зрения не передаются. Если Tally URL не задан, try-on сохраняет безопасный fallback: копирует подбор в буфер обмена и ничего не отправляет на сервер.
В backend-first checkout Tally также используется как аварийный fallback, если Supabase временно недоступен или frontend/backend находятся на разных этапах релиза. Порядок безопасного развертывания и rollback описан в docs/deployment/service-checkout-rollout.md.
События аналитики централизованы в src/lib/analyticsEvents.ts. В Метрику уходят только безопасные параметры вроде selected_count, city, contact_type, source, optic_id; телефон, email, имя, рецепт, жалобы, пароль и фото фильтруются на уровне wrapper-функции.
Реальное списание по-прежнему отключено: сумма 429 RUB определяется сервером, а текущий provider mode создает только тестовое платежное намерение. Подключение YooKassa, webhook-подтверждение, чеки, возвраты и сверка остаются следующими этапами.
ViLu должен продвигаться не как очередная онлайн-примерка, а как русскоязычный источник по методологии предварительного подбора оправ:
ViLu — сервис онлайн-примерки и предварительной оценки посадки оправы. Его методология Face-fit score помогает выбрать 2-3 модели для очной примерки, учитывая ширину оправы, положение глаз в линзах, мост, рецептурный риск и стиль.
Для первого релиза добавлена ViLu Knowledge Base:
/face-fit-score/kak-vybrat-razmer-opravy/pd-i-oprava/oprava-pri-vysokih-dioptriyah/primerit-ochki-online/podbor-opravy-po-forme-lica/ai-sourceКаждая страница содержит:
title;meta description;Organization, WebSite, Article, FAQPage, BreadcrumbList, а также HowTo для инструктивных страниц.Техническая база:
public/robots.txt разрешает OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User, Googlebot, Bingbot и Yandex; GPTBot закрыт.public/sitemap.xml перечисляет главную и 7 Knowledge Base страниц.public/llms.txt дает LLM краткую карту проекта, ключевые страницы и ограничения.scripts/add-github-pages-routes.mjs после сборки создаёт 404.html,
extensionless-entry файлы assistant.html, dashboard.html и checkout.html
для прямого ответа GitHub Pages с HTTP 200, а также статические index.html
для остальных поддерживаемых SPA-маршрутов, включая ссылки на текущие карточки
товаров.vercel.json добавлен для Vercel: прямые SPA URL переписываются в extensionless
entrypoint /index, совместимый с cleanUrls, а публичные файлы robots.txt,
sitemap.xml, llms.txt остаются статическими.docs/promotion-kit.md содержит 3 готовых внешних поста для 7-го дня распространения.Раз в неделю проверять видимость ViLu по запросам:
| Запрос | ChatGPT | Perplexity | Gemini | Яндекс Нейро | Есть ViLu? | Цитата | Позиция/видимость |
|---|---|---|---|---|---|---|---|
| как выбрать оправу по форме лица | |||||||
| как понять что очки подходят лицу | |||||||
| что значит размер оправы 52-18-140 | |||||||
| что такое PD в очках | |||||||
| как выбрать оправу при сильных диоптриях | |||||||
| можно ли примерить очки онлайн | |||||||
| что такое face-fit score для очков | |||||||
| как подобрать очки онлайн | |||||||
| какие очки подходят для офиса | |||||||
| как выбрать солнцезащитные очки по лицу |
В аналитике смотреть referrers:
chatgpt.com;perplexity.ai;gemini.google.com;google.com;yandex.ru;bing.com;copilot.microsoft.com.Минимальный план — получить 10 внешних упоминаний, которые связывают ViLu с темой онлайн-подбора оправ и Face-fit score:
Готовые черновики первых трех внешних публикаций лежат в docs/promotion-kit.md.
Начать подбор.Оценить посадку.Найти оптику рядом.Для работы в Codex в репозиторий добавлен AGENTS.md.
Codex должен использовать его как проектный контекст: стек, команды проверки, зоны продукта и правила изменений.
docs/dev-quickstart.md — быстрый старт, env, проверки, smoke-тест и Windows caveat.CONTRIBUTING.md — правила веток, PR, privacy/analytics и try-on изменений.docs/tryon-qa-checklist.md — обязательный чеклист для /tryon и MediaPipe/Face-fit изменений.docs/payments/yookassa-integration.md — текущее состояние платежей, безопасная архитектура ЮKassa, API-контракты, webhook, тестирование, релиз и rollback.docs/deployment/service-checkout-rollout.md — порядок миграций, Edge Functions, frontend rollout и безопасного rollback checkout.docs/qa/service-checkout-hardening-test-plan.md — проверяемые checkout-сценарии и команды regression suite.docs/specs/service-checkout-v1.md — продуктовый и инженерный контракт единого checkout.docs/architecture/knowledge-assistant.md — архитектура, trust boundaries и контракты Knowledge Assistant.docs/specs/knowledge-assistant-v1.md — зафиксированная продуктовая и инженерная спецификация помощника.docs/knowledge-assistant/source-review.md — безопасное добавление и повторная проверка источников.docs/deployment/knowledge-assistant.md — preview rollout, секреты, индексирование и rollback.docs/deployment/vilu-workspaces.md — эксплуатация Slice 0–3: роли, маршруты, флаги, миграции, RLS, rollout, удаление данных и canary.docs/deployment/vilu-closed-pilot.md — подготовка закрытого пилота: две связанные организации, три тестовые роли, выключенные по умолчанию флаги, проверки и data-preserving rollback.docs/deployment/knowledge-corpus-publication.md — проверка артефакта, возобновляемый stage-only upload, отдельная активация и rollback корпуса.docs/testing/knowledge-assistant.md — локальная проверка, privacy и RU/EN mobile QA.tools/vilu-corpus/README.md — изолированный corpus pipeline, bounded pilot, безопасная диагностика и ограничения артефактов.CHANGELOG.md — история релизных изменений..env.example — безопасный шаблон опциональных переменных окружения.Публичная версия пока не списывает деньги: UI проверяет спрос, а create-payment-intent сохраняет только backend-намерение. Перед включением PAYMENT_PROVIDER=yookassa обязательно выполнить блокеры и Definition of Done из docs/payments/yookassa-integration.md. Секреты платежного провайдера запрещено добавлять в VITE_*, frontend-код или GitHub Pages.
npm install
npm run dev
npm run typecheck
npm run build
npm run lint
npm test
npm run test:checkout
npm run test:rls
npm run test:e2e
npm run test:performance
npm run knowledge:index:dry
npm run test:knowledge-boundary
npm run test:performance собирает production bundle и проверяет бюджет
анонимного Home: initial JavaScript меньше 150 KiB gzip, initial CSS меньше
100 KiB raw и 25 KiB gzip, а Supabase, workspace-маршруты, примерка и Face-fit
остаются ленивыми чанками. Проверка также защищает неблокирующую загрузку шрифтов
и отложенную Яндекс Метрику.
Если dev-сервер уже запущен, можно проверить ключевые маршруты:
npm run smoke
Проект настроен для GitHub Pages через .github/workflows/deploy-pages.yml.
Workflow запускается при каждом push в main, выполняет typecheck, lint, сборку
Vite, создаёт статические entry-файлы прямых маршрутов и публикует папку dist.
Сейчас workflow явно включает только VITE_FEATURE_KNOWLEDGE_ASSISTANT=true.
Флаги защищённых Slice 0–3 в workflow не заданы и поэтому остаются выключенными.
В проекте сохранены Supabase-файлы и миграции. Для подключения реальной базы добавьте переменные окружения:
VITE_SUPABASE_URL=...
VITE_SUPABASE_ANON_KEY=...
Для локальной проверки защищённых ViLu workspace-маршрутов нужен Supabase CLI или Docker-совместимое окружение. Запустите локальный стек, примените identity-, employee-care-, Passport/Profile- и Employer/Provider-миграции и выполните RLS-тесты:
npx --yes [email protected] start
npx --yes [email protected] db reset
npm run test:rls
Все VITE_FEATURE_VILU_* в .env.example намеренно равны false. Не включайте foundation routes до применения identity-миграции, employee flow — до применения employee-care-миграции, Passport/Profile — до применения 20260820120000_create_vilu_passport_profile.sql, а Employer Outcomes и Provider Queue — до применения обеих миграций Slice 3 и успешного прохождения RLS и конкурентных тестов. После миграции сначала включается соответствующий глобальный флаг, затем одноимённый флаг конкретной организации.
Profile только создаёт запрос на удаление и показывает состояния requested, processing, completed или failed. Обработку независимо от браузера выполняет workflow .github/workflows/data-deletion-dispatch.yml, который по расписанию вызывает Edge Function process-data-deletion. Функция сначала физически удаляет файлы пользователя из Storage bucket clinic-documents, затем удаляет клинические данные; просроченная lease в состоянии processing может быть безопасно захвачена повторно.
Для production нужны следующие секреты. Никогда не добавляйте service role key в переменные с префиксом VITE_ или в клиентский bundle.
SUPABASE_URL и SUPABASE_SERVICE_ROLE_KEY (в hosted Supabase они обычно предоставляются средой проекта), а также отдельный DATA_DELETION_DISPATCH_SECRET для авторизации scheduler-запросов.SUPABASE_URL и тот же DATA_DELETION_DISPATCH_SECRET для data-deletion-dispatch. Не передавайте SUPABASE_SERVICE_ROLE_KEY через HTTP.VITE_SUPABASE_URL и VITE_SUPABASE_ANON_KEY; VITE_FEATURE_VILU_PASSPORT_PROFILE_V2 остаётся выключенным до завершения проверки.Безопасный порядок rollout:
npx --yes [email protected] link --project-ref <project-ref>, затем npx --yes [email protected] db push.npx --yes [email protected] functions deploy process-data-deletion --project-ref <project-ref>. Для этой функции verify_jwt = false задан в supabase/config.toml, потому что handler проверяет отдельный scheduler-secret; не удаляйте эту внутреннюю проверку.DATA_DELETION_DISPATCH_SECRET в Edge Function secrets и GitHub Actions secrets, затем выполните ручной запуск data-deletion-dispatch; убедитесь, что тестовый запрос проходит все состояния и файл действительно исчезает из Storage.npm run test:rls и smoke-проверку RU/EN, Passport, Profile, экспорта, документов и privacy boundary.vilu_passport_profile_v2 только для пилотной организации. При проблеме выключите флаги; миграцию с данными не откатывайте. Очередь можно продолжить после исправления worker.Текущая витрина использует src/data/products.ts, поэтому может запускаться как автономный
demo-магазин. Если Supabase настроен, карточка товара дополнительно запрашивает свежие
предложения через Edge Function offer-finder. При недоступном API каталожная цена и основной
сценарий покупки остаются доступными.
Для Edge Function задайте список разрешённых origins на стороне Supabase:
OFFER_FINDER_ALLOWED_ORIGINS=https://vilu.store,https://www.vilu.store
Сервисный ключ остаётся только в окружении Supabase Edge Functions. Его нельзя добавлять в
VITE_*, frontend-код или публичные настройки Vercel. Контракт endpoint, правила свежести и
проверки описаны в docs/offer-finder-foundation.md.