A focused web app for post-meeting notes, shared follow-up items, and per-student supervision history.
- Astro v6 - Modern web framework with server-first rendering
- React v19 - UI library for interactive components
- TypeScript v5 - Type-safe JavaScript
- Tailwind CSS v4 - Utility-first CSS framework
- Supabase - Authentication and backend-as-a-service
- Cloudflare Workers - Edge deployment runtime
- Node.js v22.14.0 (as specified in
.nvmrc) - npm (comes with Node.js)
- Clone the repository:
git clone https://github.com/ounold/10xdev.git
cd 10xdev- Install dependencies:
npm install-
Set up Supabase and configure environment variables — see Supabase Configuration below.
-
Create a
.dev.varsfile for local Cloudflare dev secrets:
cp .env.example .dev.vars- Run the development server:
npm run devnpm run dev- Start development server (Cloudflare workerd runtime)npm run build- Build for productionnpm run preview- Preview production buildnpm run lint- Run ESLint with type-checked rulesnpm run lint:fix- Auto-fix ESLint issuesnpm run format- Run Prettier
.
├── src/
│ ├── layouts/ # Astro layouts
│ ├── pages/ # Astro pages
│ │ └── api/ # API endpoints
│ ├── components/ # UI components (Astro & React)
│ └── assets/ # Static assets
├── public/ # Public assets
├── wrangler.jsonc # Cloudflare Workers configThis project uses Supabase for authentication. Environment variables are declared via Astro's astro:env schema and are treated as server-only secrets — they are never exposed to the client.
Requires Docker and ~7 GB RAM.
- Create your
.envfile:
cp .env.example .env- Initialize the local Supabase project (creates a
supabase/config folder):
npx supabase init- Start the local stack (downloads Docker images on first run):
npx supabase start- Copy the credentials printed by the CLI into your
.envand.dev.vars:
SUPABASE_URL=http://127.0.0.1:54321
SUPABASE_KEY=<anon key from CLI output>
- To stop the stack when done:
npx supabase stopThe local Studio UI is available at http://localhost:54323.
No database tables or migrations are required — this project uses Supabase Auth's built-in auth.users table only.
If you prefer to use a hosted Supabase project, add these variables to your .env and .dev.vars files:
| Variable | Description |
|---|---|
SUPABASE_URL |
Project URL from Supabase dashboard → Settings → API |
SUPABASE_KEY |
anon public key from Supabase dashboard → Settings → API |
SUPABASE_URL=https://<project-ref>.supabase.co
SUPABASE_KEY=<anon-key>
By default Supabase requires email confirmation before a user can sign in. To skip this during local development:
- Open the Supabase dashboard for your project
- Go to Authentication → Email → Confirm email
- Toggle it off
Users can then sign in immediately after sign-up without clicking a confirmation link.
| Route | Description |
|---|---|
/auth/signin |
Email/password sign-in form |
/auth/signup |
Email/password sign-up form |
/auth/confirm-email |
Post-signup "check your inbox" page |
/dashboard |
Example protected page (redirects to /auth/signin if unauthenticated) |
Route protection is handled in src/middleware.ts. Add paths to the PROTECTED_ROUTES array there to require authentication.
This project deploys to Cloudflare Workers.
- Build the project:
npm run build- Deploy with Wrangler:
npx wrangler deploySet SUPABASE_URL and SUPABASE_KEY as secrets in your Cloudflare dashboard or via npx wrangler secret put.
GitHub Actions runs lint + build on every push and PR to master. Configure SUPABASE_URL and SUPABASE_KEY as repository secrets in GitHub for the build step.
MIT
