Micro-SaaS de Cápsulas do Tempo Digitais para presentes sazonais e datas comemorativas.
Definir a base arquitetural do projeto com:
- Front-end em React + Vite + Tailwind CSS.
- Back-end em Node.js + Express.js.
- Banco de dados PostgreSQL com Prisma ORM.
- Estrutura preparada para uma experiência de presente imersiva, mobile-first e de alto impacto visual.
O fluxo da página do presente deve considerar quatro momentos principais:
- Tela de entrada com lacre ou envelope digital, exigindo uma ação explícita do usuário para abrir a cápsula.
- Ativação suave de áudio em background assim que a cápsula for aberta.
- Linha do tempo visual com fotos, legendas e transições limpas em scroll vertical.
- Carta viva com efeito typewriter para revelar a mensagem principal no ritmo da experiência.
AuraBox/
├── frontend/
│ ├── public/
│ ├── src/
│ │ ├── assets/
│ │ ├── components/
│ │ ├── features/
│ │ ├── hooks/
│ │ ├── lib/
│ │ ├── pages/
│ │ ├── services/
│ │ ├── styles/
│ │ ├── types/
│ │ ├── utils/
│ │ ├── App.tsx
│ │ └── main.tsx
│ ├── index.html
│ ├── package.json
│ ├── postcss.config.js
│ ├── tailwind.config.js
│ ├── tsconfig.json
│ └── vite.config.ts
├── backend/
│ ├── prisma/
│ │ └── schema.prisma
│ ├── src/
│ │ ├── config/
│ │ ├── controllers/
│ │ ├── middlewares/
│ │ ├── routes/
│ │ ├── services/
│ │ ├── validators/
│ │ ├── utils/
│ │ ├── app.ts
│ │ └── server.ts
│ ├── package.json
│ ├── tsconfig.json
│ └── .env
├── README.md
└── .gitignore
Para a primeira versão, a modelagem mais saudável é separar a cápsula do tempo e os itens da linha do tempo em duas tabelas. Isso evita um campo JSON rígido e facilita ordenação, edição e expansão futura.
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Capsule {
id String @id @default(uuid())
title String
songUrl String?
letter String
slug String @unique
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
timelineItems TimelineItem[]
}
model TimelineItem {
id String @id @default(uuid())
capsuleId String
imageUrl String
caption String
sortOrder Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
capsule Capsule @relation(fields: [capsuleId], references: [id], onDelete: Cascade)
@@index([capsuleId])
@@index([sortOrder])
}Se quiser manter tudo em uma única tabela por enquanto, o campo timelineItems também pode ser representado como Json, mas a abordagem relacional acima é a mais flexível para o produto.
mkdir AuraBox
cd AuraBox
mkdir frontend backendcd frontend
npm create vite@latest . -- --template react-ts
npm install
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -pcd ../backend
npm init -y
npm install express cors dotenv
npm install -D typescript tsx @types/node @types/express @types/cors prisma
npm install @prisma/client
npx tsc --init
npx prisma initCrie um banco local ou use Neon e adicione a string em backend/.env:
DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=public"cd backend
npx prisma migrate dev --name init
npx prisma generateDepois disso, crie os arquivos principais:
frontend/src/main.tsxfrontend/src/App.tsxbackend/src/app.tsbackend/src/server.ts
E adicione scripts de desenvolvimento em cada package.json:
- Front-end:
npm run dev - Back-end:
npm run dev
- Criar os projetos iniciais em
frontendebackend. - Configurar Tailwind, Prisma e o servidor Express base.
- Definir o primeiro fluxo de acesso da cápsula e o contrato da API.