Simple, clean, and efficient meeting scheduling app.
├── README.md
├── drizzle.config.ts
├── next.config.mjs
├── node_modules
├── package.json
├── src
│ ├── app
│ │ └── [ all front-end routes ]
│ ├── components
│ │ └── [ front-end components ]
│ ├── db
│ │ ├── index.ts
│ │ ├── migrations
│ │ └── schema.ts
│ ├── lib
│ └── server
│ ├── actions ( mutate or insert data )
│ │ └── [ entity ]
│ │ └── [ verb ]
│ │ └── action.ts
│ └── data ( query data )
│ └── [ entity ]
│ └── queries.ts
└── tsconfig.json- Git
- Node.js
- pnpm
- Just run
npm i -g pnpmto install.
- Just run
- Docker Desktop
- Clone this repository locally
- Navigate to the root directory and install the dependencies.
cd ZotMeetpnpm install
- Copy the example environment file:
cp .env.example .env
- Make sure Docker Desktop is running, then set up the database:
pnpm db:setup
- Start the development server
pnpm dev(runpnpm dev --hostif you want to access the server from other devices on your network)
- The app should be viewable at
localhost:3000by default.
| Command | Description |
|---|---|
pnpm db:setup |
Start database and run migrations (first time setup) |
pnpm db:start |
Start the PostgreSQL container |
pnpm db:stop |
Stop the PostgreSQL container (data persists) |
pnpm db:reset |
Reset database - removes all data and re-runs migrations |
pnpm db:generate |
Generate new migrations from schema changes |
pnpm db:migrate |
Apply pending migrations |
pnpm db:studio |
Open Drizzle Studio to browse your database |
- Follow the Conventional Commits specification when writing commit messages.
- E.g.,
git commit -m "feat: add this feature";git commit -m "fix: fix this bug".
- E.g.,
- Keep commits and PRs atomic.
- A PR should be a single feature or bug fix.
- A commit should be a single logical change.
If you need credentials for the .env file, contact the project lead (Kyle).
After changes to the .env file, run pnpm run check to update SvelteKit's auto-generated environment variable types.
erDiagram
users {
string id PK, FK
string email
string passwordHash
timestamp createdAt
}
groups {
uuid id PK
string name
string description
timestamp createdAt
string createdBy FK
}
usersInGroup {
string userId FK
uuid groupId FK
}
members {
uuid id PK
string displayName
}
availability {
uuid memberId FK
uuid meetingId FK
json meetingAvailabilities
enum status
}
meeting {
uuid id PK
string title
string description
string location
json dates
string meetingType
boolean scheduled
time fromTime
time toTime
string timezone
uuid groupId FK
uuid hostId FK
timestamp createdAt
}
sessions {
string id PK
timestamp expiresAt
string userId FK
string googleAccessToken
string googleRefreshToken
timestamp googleAccessTokenExpiresAt
}
oauth_accounts {
string userId FK
string providerId PK
string providerUserId PK
}
meeting ||--o{ availability : has
users ||--o{ usersInGroup : has
groups ||--o{ usersInGroup : contains
members ||--o| users : extends
members ||--o{ availability : provides
users ||--o{ sessions : has
users ||--o{ oauth_accounts : has