Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Sistema completo para clínicas odontológicas: site da clínica com agendamento online e painel administrativo para a equipe (agenda visual, profissionais, pacientes e configurações). Pensado como white-label: você troca nome, cores e logo em um único arquivo e entrega o produto com a sua marca.
Site público da clínica (/clinica/<slug>)
/agendar/<slug>) que mostra só horários realmente livres.Painel da clínica (/dashboard, com login)
Perfis de acesso: Administrador, Recepção e Dentista (o dentista vê a agenda e bloqueia apenas a própria agenda).
Requisitos: Node.js 18.18+ (recomendado 20) e Docker (ou qualquer PostgreSQL 14+).
cp .env.example .env # ajuste se não for usar o banco do Docker
npm install
npm run db:up # sobe o PostgreSQL local (docker-compose.yml)
npm run db:setup # cria as tabelas e carrega a clínica de demonstração
npm run dev # http://localhost:3000
Logins da demonstração (clínica fictícia Sorriso Pleno Odontologia):
| Perfil | Senha | |
|---|---|---|
| Administrador | [email protected] | admin123 |
| Recepção | [email protected] | recepcao123 |
| Dentista | [email protected] | dentista123 |
Site da clínica: http://localhost:3000/clinica/sorriso-pleno
.env):
DATABASE_URL: conexão usada pela aplicação.DIRECT_URL: conexão direta usada pelas migrations. Localmente é igual à
DATABASE_URL; em provedores com pool (Supabase, Neon), use a URL do pool
na DATABASE_URL e a conexão direta na DIRECT_URL.prisma/migrations e são aplicadas com
npm run db:migrate (o npm run build também aplica, o que facilita o deploy).prisma/schema.prisma e rode
npx prisma migrate dev --name descricao-da-mudanca para gerar a migration.npm run db:seed. O seed é idempotente (pode rodar
de novo sem duplicar). Em produção ele também pode ser disparado por
GET /api/seed?key=<SEED_SECRET>; sem SEED_SECRET definido, a rota fica desligada.npm run prisma:studio.Tudo fica em src/config/white-label.ts:
| Campo | O que muda |
|---|---|
productName, productTagline, productDescription | Nome e textos do produto (aba do navegador, login, página inicial, rodapé do painel) |
logoUrl | Logo do produto. null usa o ícone padrão. Aceita URL ou arquivo em /public (ex.: "/images/logo.svg") |
colors.primary / secondary / accent | Paleta do sistema inteiro: o Tailwind gera as variáveis de cor a partir daqui |
dentistColors | Paleta sugerida para diferenciar profissionais na agenda |
contact | E-mail, telefone e WhatsApp comercial na página inicial (vazio = oculto) |
defaults | Texto padrão do botão de agendamento e duração padrão da consulta |
demo | Clínica de demonstração em destaque e quadro de credenciais no login |
Depois de alterar, reinicie o npm run dev (as cores são lidas no build do CSS).
Antes de entregar a um cliente, em src/config/white-label.ts:
demo.showCredentialsOnLogin: false para esconder o quadro de credenciais;demo.clinicSlug: null para remover os atalhos da demonstração.Também troque as senhas da demonstração ou crie a clínica real direto no banco.
Cada clínica pode ainda ter identidade própria (logo, cores, imagens e textos do site) em Administração > Identidade visual. O que a clínica salva no banco tem prioridade sobre o padrão do arquivo de configuração.
POST /api/uploads (só Administrador) confere o tipo real do arquivo
(JPG, PNG ou WebP; SVG é recusado) e o limite de 3 MB.Asset do próprio PostgreSQL e são servidas por
GET /api/assets/<id> com cache longo (navegador e CDN). Assim o sistema
funciona em qualquer hospedagem, sem contratar armazenamento de arquivos.src/app/api/uploads/route.ts (que devolve a URL
final da imagem); o resto do sistema só guarda essa URL.O agendamento online (/api/public/availability) cruza, para o dia escolhido:
A criação do agendamento (/api/public/appointments) revalida tudo isso dentro
de uma transação serializável, então dois pacientes não conseguem pegar o mesmo
horário. Na agenda interna, a equipe pode encaixar consultas fora da grade, mas
nunca sobre um bloqueio ou outra consulta do mesmo profissional.
Fuso: todos os horários são tratados no horário de Brasília (UTC-3), independente
do fuso do servidor ou do navegador (src/lib/dates.ts).
DATABASE_URL e DIRECT_URL (veja Banco de dados);NEXTAUTH_SECRET: string aleatória longa (openssl rand -base64 32);NEXTAUTH_URL: URL pública do sistema (ex.: https://agenda.suaclinica.com.br);SEED_SECRET (opcional): libera /api/seed para carregar a demonstração.O arquivo vercel.json fixa a região gru1 (São Paulo); ajuste se o banco
estiver em outra região, para reduzir a latência.
src/
config/white-label.ts # marca, cores e textos do produto
app/
page.tsx # página inicial do produto
login/ # login
clinica/[slug]/ # site público da clínica
agendar/[slug]/ # agendamento online
dashboard/ # painel (agenda, dentistas, pacientes, administracao...)
api/ # rotas internas (sessão) e públicas (api/public/*)
components/
ui/ # componentes shadcn/ui
dashboard/ # menu lateral e barra superior do painel
lib/
assets.ts # validação e limpeza das imagens enviadas
image-compress.ts # redimensiona/comprime imagem no navegador
public-clinic.ts # dados públicos da clínica (site e prévia)
availability.ts # horários livres, grade e bloqueios
dates.ts # horário de Brasília
validation.ts # schemas Zod
demo-seed.ts # clínica de demonstração
notifications.ts # ponto de integração para e-mail/WhatsApp
prisma/
schema.prisma # modelo de dados
migrations/ # histórico de migrations
docker-compose.yml # PostgreSQL local
Clinic: a clínica (multi-clínica por clinicId), com identidade visual e duração da consulta.User: acesso ao painel (ADMIN, RECEPTIONIST, DENTIST).Dentist, DentistSchedule: profissional e sua grade semanal.WorkingHour: funcionamento da clínica por dia da semana.TimeBlock: bloqueios de agenda (profissional ou clínica inteira).Patient, Contact: pacientes e contatos (WhatsApp, telefone, e-mail).Service: serviços exibidos no site e vinculáveis à consulta.Appointment: consultas, com status e serviço.ContactMessage: mensagens do formulário do site.Asset: imagens enviadas pelo painel.clinicId da sessão, nunca do navegador: uma clínica
não acessa dados de outra.src/middleware.ts protege /dashboard/*; alterações de cadastro e configuração
exigem perfil Administrador.src/lib/notifications.ts é chamado a cada agendamento criado ou remarcado.
Hoje só registra em log; é o lugar para plugar e-mail (Resend, SES) ou
WhatsApp (Meta Cloud API, Twilio) sem mexer nas telas.
As fotos em public/images/demo/ são do Unsplash
(Unsplash License: uso livre, inclusive comercial). As pessoas nas fotos não são
os profissionais fictícios da demonstração. Substitua pelas imagens da clínica real.