Biovity es una plataforma chilena diseñada para conectar profesionales y estudiantes con oportunidades laborales en el sector científico. Especializada en biotecnología, bioquímica, química, ingeniería química y salud, facilitamos el encuentro entre el talento y las empresas del sector científico.
Biovity ayuda a profesionales y estudiantes a encontrar trabajo y oportunidades en el campo científico. La plataforma ofrece:
Clonar el repositorio
git clone <repository-url>
cd biovity
Instalar dependencias
bun install
Configurar variables de entorno
cp .env.example .env.local
Edita .env.local con tus credenciales.
Iniciar el servidor de desarrollo
bun dev
Abrir en el navegador
http://localhost:3000
# Desarrollo
bun dev # Inicia el servidor de desarrollo con Turbopack
bun dev:portless # Dev con Portless (shareable URLs)
# Producción
bun build # Construye la aplicación para producción
bun start # Inicia el servidor de producción
# Calidad de Código
bun lint # Ejecuta Biome para verificar el código
bun format # Formatea el código con Biome
bun check # Ejecuta lint y aplica correcciones automáticas
bun typecheck # Verifica los tipos de TypeScript
biovity/
├── app/ # Rutas y páginas (Next.js App Router)
│ ├── api/ # API routes
│ │ ├── auth/[...all]/ # Better Auth endpoint
│ │ ├── admin/ # Admin API routes
│ │ ├── ai/ # AI endpoints (scoring, actions)
│ │ ├── chats/ # Chat API
│ │ ├── messages/ # Messages API
│ │ ├── jobs/ # Jobs API
│ │ ├── og/ # Dynamic OG images
│ │ └── cron/ # Cron jobs
│ ├── dashboard/ # Panel de control (Parallel Routes)
│ │ ├── @admin/ # Admin dashboard
│ │ ├── @user/ # Professional dashboard
│ │ └── @organization/ # Organization dashboard
│ ├── login/ # Páginas de login
│ ├── register/ # Páginas de registro
│ └── blog/ # Blog (MDX)
├── components/
│ ├── ai/ # AI components (AnalyzeButton, AIScoreBadge, etc.)
│ ├── ai-elements/ # AI UI elements (prompt-input, message, code-block)
│ ├── animate-ui/ # Animated Radix/UI primitives
│ ├── base/ # Base primitives (avatar, select, input)
│ ├── blog/ # Blog components
│ ├── common/ # Common components (Header, Footer, DatePicker)
│ ├── dashboard/ # Dashboard components
│ │ ├── employee/ # Employee dashboard tabs
│ │ └── organization/ # Organization dashboard tabs
│ ├── landing/ # Landing page sections
│ ├── layouts/ # Layout wrappers
│ ├── providers/ # Context providers
│ ├── seo/ # SEO components (JsonLd)
│ └── ui/ # Shadcn + charts
├── hooks/ # Custom React hooks
├── lib/
│ ├── api/ # API client functions (fetchJson pattern)
│ ├── auth.ts # Better Auth server config
│ ├── auth-client.ts # Better Auth client config
│ ├── data/ # Static data (jobs, categories, filters)
│ ├── db/ # Database connection + migrations
│ ├── errors.ts # Typed error constructors (TaggedError)
│ ├── result.ts # better-result helpers (fetchJson, etc.)
│ ├── types/ # TypeScript definitions
│ ├── utils.ts # Utility functions (cn, formatCurrencyCLP)
│ └── validations/ # Zod schemas
├── content/blog/ # Blog posts (MDX)
└── docs/ # Plans, SECURITY, COMMITS
Usamos better-result con Result.tryPromise() en vez de try/catch:
import { Result as R } from "better-result"
import { fetchJson } from "@/lib/result"
const getJobs = async () => {
return fetchJson<Job[]>("/api/jobs")
}
const result = await getJobs()
if (result.isErr()) {
console.error(result.error)
return
}
const jobs = result.value
import { TaggedError } from "better-result"
class DbError extends TaggedError<{ cause?: string }> {
readonly _tag = "DbError"
}
class ApiError extends TaggedError<{ status: number }> {
readonly _tag = "ApiError"
}
Evitamos useEffect para data fetching. Usamos:
useQuery, useMutation) para datos del servidoruseSession) para autenticaciónuseLoaderData de Next.js para server componentsUsamos type en vez de interface:
// ❌ Evitar
interface Props { name: string }
// ✅ Preferir
type Props = { name: string }
Better Auth está configurado con:
type (professional/organization), profession, avatar, isActive, organizationIdVariables de entorno requeridas:
DATABASE_URL – PostgreSQL connection stringBETTER_AUTH_SECRET – Auth secretBETTER_AUTH_URL – Auth URLBETTER_AUTH_API_KEY – Dash plugin API keyADMIN_EMAILS – Comma-separated admin emails (opcional)NEXT_PUBLIC_APP_URL – App URL<tipo>/<descripción-corta>
Tipos: feat/, fix/, hotfix/, design/, refactor/, docs/, test/, chore/, perf/, style/, ci/
Seguimos Conventional Commits:
<tipo>(<alcance>): <descripción>
feat(auth): agregar autenticación con Google
fix(dashboard): corregir cálculo de métricas
refactor(api): usar better-result pattern
bun format ejecuta sin erroresbun lint pasa sin warningsbun typecheck pasa sin erroresEste proyecto es privado y confidencial.