尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Plataforma de descubrimiento de lugares en Cuba con inteligencia artificial.
La Verde ayuda a residentes y viajeros a encontrar los mejores lugares en Cuba usando lenguaje natural. Describe lo que buscas y la IA encuentra los lugares perfectos para ti.
| Capa | Tecnología |
|---|---|
| Framework | Next.js 15 (App Router) |
| Lenguaje | TypeScript (strict) |
| Estilos | Tailwind CSS 3.4 + shadcn/ui |
| Base de datos | PostgreSQL (Neon) + Drizzle ORM |
| Autenticación | Clerk |
| Mapas | Leaflet + React-Leaflet (OpenStreetMap) |
| IA | OpenAI gpt-4o-mini + pgvector |
| Storage | Cloudflare R2 |
| Deploy | Vercel + Neon |
src/
├── app/ # Next.js App Router pages
│ ├── (auth)/ # Auth routes (login, register)
│ ├── (main)/ # App routes (home, place, business)
│ ├── api/ # API routes (search, places, ai, auth, upload)
│ ├── layout.tsx # Root layout con fonts + providers
│ ├── page.tsx # Landing page
│ └── globals.css # Design tokens + Tailwind base
├── components/
│ ├── ui/ # shadcn/ui components
│ ├── layout/ # Header, Footer, BottomSheet
│ ├── map/ # MapView, MapMarker, MapControls
│ ├── search/ # AISearch, SearchSuggestions, SearchResults
│ ├── place/ # PlaceCard, PlaceDetail, PhotoCarousel, etc.
│ ├── business/ # PanelShell, DashboardStats, FormSection, etc.
│ ├── landing/ # Hero, HowItWorks, CTASection
│ └── onboarding/ # OnboardingShell, PreferenceChip, LocationPicker
├── config/
│ └── site.ts # Site config + AI config
├── hooks/ # Custom React hooks
├── lib/
│ ├── ai/ # OpenAI integration, embeddings, NL parser
│ ├── db/
│ │ ├── schema/ # Drizzle schema definitions
│ │ ├── migrations/ # Auto-generated migrations
│ │ └── index.ts # DB client
│ ├── storage/ # Cloudflare R2 client
│ ├── auth.ts # Clerk auth helpers
│ ├── constants.ts # Categories, cities, currencies, moods
│ └── utils.ts # cn(), formatters, slugify, generateId
├── providers/ # React context providers (ThemeProvider)
├── types/ # TypeScript types + Zod schemas
└── middleware.ts # Clerk middleware
git clone <repo-url> la-verde
cd la-verde
npm install
cp .env.example .env.local
Edita .env.local con tus credenciales:
| Variable | Descripción |
|---|---|
DATABASE_URL | Connection string de Neon PostgreSQL |
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY | Clerk publishable key |
CLERK_SECRET_KEY | Clerk secret key |
OPENAI_API_KEY | OpenAI API key |
AWS_ENDPOINT_URL_S3 | Endpoint de la rama, en Branch → Storage de la consola de Neon |
AWS_ACCESS_KEY_ID | token_id de una credencial de Neon con storage:read y storage:write |
AWS_SECRET_ACCESS_KEY | s3_secret_access_key, que solo se devuelve al crear la credencial |
AWS_REGION | Región real de la rama. auto no vale |
S3_BUCKET_NAME | Bucket de las fotos. Por defecto la-verde-images |
El bucket tiene que estar en public_read. Se cambia en la consola o en la API
de Neon, no por S3: PutBucketAcl devuelve 501 Not Implemented. Con un bucket
privado, las fotos se suben pero la ficha pública no las puede leer.
# Generar migraciones desde el schema
npm run db:generate
# Aplicar migraciones a Neon
npm run db:migrate
# (Opcional) Hacer push directo del schema
npm run db:push
# Abrir Drizzle Studio para inspeccionar datos
npm run db:studio
npm run db:seed
npm run dev
# → http://localhost:3000
| Tabla | Propósito |
|---|---|
users | Usuarios sincronizados con Clerk |
categories | Categorías de lugares (Cafetería, Restaurante, etc.) |
places | Lugares con coordenadas, horarios, monedas, ambiente |
place_images | Fotos de cada lugar (una cover + galería) |
place_hours | Horarios por día de la semana |
place_menu_items | Items de menú con precio y moneda |
reviews | Reseñas de usuarios (rating 1-5) |
saved_places | Lugares guardados/favoritos por usuario |
business_owners | Relación dueño/manager → lugar |
user_search_history | Historial de búsquedas del usuario |
npm run dev # Desarrollo
npm run build # Build producción
npm run lint # ESLint
npm run typecheck # TypeScript check
npm run db:generate # Generar migraciones Drizzle
npm run db:migrate # Aplicar migraciones
npm run db:push # Push schema directo
npm run db:studio # Drizzle Studio UI
npm run db:seed # Sembrar datos de prueba
(auth), (main)@/ alias apunta a src/components/ui/, componentes de negocio en components/*/lv-*lib/db/schema/noUncheckedIndexedAccesslib/ai/, streaming via ai SDK