@mysadigital/buzzboard-ui
v0.1.2
Published
Shared React component library for BuzzBoard v2
Maintainers
Readme
BuzzBoard v2
A productivity app built by Reece Preston at Mysa Digital. Combines task management, habit tracking, bullet journalling, goal setting, mood/energy tracking, and an AI assistant.
Live Deployments
| Environment | URL | Status | |-------------|-----|--------| | Primary (mysaserv) | https://buzzboard.mysa.live | ✅ Active | | Fly.io | — | ❌ Decommissioned |
The mysaserv deployment is the sole active deployment. Fly.io was fully decommissioned on 22 April 2026.
Tech Stack
| Layer | Technology |
|-------|------------|
| Frontend | React + Vite |
| Backend | Express + Prisma |
| Database | MySQL 8.0 |
| Sessions | Redis 7 |
| Auth | Email/password, Google OAuth, GitHub OAuth |
| Package manager | pnpm (workspaces monorepo) |
| Node version | 20 |
| Component library | @mysadigital/[email protected] (published to npm) |
Repository Structure
~/buzzboard/ # Monorepo root
└── buzzboard-hosted/
├── packages/
│ ├── backend/ # Express + Prisma + MySQL
│ │ ├── src/
│ │ │ ├── app.ts # Express app setup
│ │ │ ├── ai/
│ │ │ │ └── LLMProvider.ts # AI provider abstraction
│ │ │ ├── modules/
│ │ │ │ ├── auth/
│ │ │ │ │ ├── passport.ts # OAuth strategies
│ │ │ │ │ └── auth.controller.ts
│ │ │ │ └── ai/
│ │ │ │ ├── ai.service.ts # AI feature logic
│ │ │ │ ├── ai.controller.ts
│ │ │ │ └── ai.routes.ts
│ │ │ ├── adapters/
│ │ │ │ ├── DataAdapter.ts
│ │ │ │ └── PrismaDataAdapter.ts
│ │ │ └── config/
│ │ │ └── env.ts
│ │ └── prisma/
│ │ └── schema.prisma # MySQL Prisma schema
│ └── frontend/ # React + Vite
│ └── nginx.conf # nginx config inside Docker container
├── docker-compose.yml # All containers defined here
└── .env.production # Environment variables (on mysaserv only, not in git)mysaserv Infrastructure
Server: Ubuntu 24, home server at 192.168.0.160
SSH: ssh [email protected]
Docker Containers
| Container | Purpose | Port |
|-----------|---------|------|
| buzzboard-hosted-frontend-1 | nginx serving React build | 8090 |
| buzzboard-hosted-backend-1 | Express API | 3001 |
| buzzboard-hosted-mysql-1 | MySQL 8.0 database | — |
| buzzboard-hosted-redis-1 | Redis 7 sessions | — |
Routing
Internet → Cloudflare Tunnel → mysaserv nginx (port 80) → localhost:8090 → frontend container
→ /api/* → backend container (port 3001)- nginx config:
/etc/nginx/sites-available/buzzboard - Cloudflare tunnel ID:
a686d6e6-2664-469f-809e-8bbc75bf4a41 - Important: The Cloudflare tunnel uses remotely managed config. The local file at
/etc/cloudflared/config.ymlis ignored. Any ingress changes must be made via the Cloudflare dashboard or API.
Key Config Already Applied
proxy_set_header X-Forwarded-Proto httpsin nginx (required for session cookies)proxy: truein Passport Google and GitHub strategies- OAuth callbacks point to
https://buzzboard.mysa.live/api/v1/auth/oauth/google/callbackand.../github/callback oauthCallbackredirects to${FRONTEND_URL}/dashboard- Prisma schema uses
mysqlprovider resolve.dedupe: ['react', 'react-dom']in vite.config.tsshamefully-hoist=truein root.npmrc
Environment Variables
Located at ~/buzzboard/buzzboard-hosted/.env.production on mysaserv. Never committed to git.
| Variable | Purpose | Status |
|----------|---------|--------|
| MYSQL_ROOT_PASSWORD | MySQL root password | ✅ Set |
| MYSQL_DATABASE | Database name | ✅ Set |
| MYSQL_USER | Database user | ✅ Set |
| MYSQL_PASSWORD | Database password | ✅ Set |
| DATABASE_URL | Prisma connection string | ✅ Set |
| SESSION_SECRET | Express session secret | ✅ Set |
| REDIS_URL | Redis connection string | ✅ Set |
| FRONTEND_URL | https://buzzboard.mysa.live | ✅ Set |
| COOKIE_DOMAIN | buzzboard.mysa.live | ✅ Set |
| GOOGLE_CLIENT_ID | Google OAuth | ✅ Set |
| GOOGLE_CLIENT_SECRET | Google OAuth | ✅ Set |
| GITHUB_CLIENT_ID | GitHub OAuth | ✅ Set |
| GITHUB_CLIENT_SECRET | GitHub OAuth | ✅ Set |
| OPENAI_API_KEY | OpenAI API | ✅ Set |
| ANTHROPIC_API_KEY | Anthropic API | ✅ Set |
| SENTRY_DSN | Sentry backend error tracking | ✅ Set |
| VITE_SENTRY_DSN | Sentry frontend error tracking | ✅ Set |
| SENTRY_TRACES_SAMPLE_RATE | 0.1 (10% of transactions) | ✅ Set |
AI Configuration
BuzzBoard uses a primary/fallback LLM provider pattern defined in packages/backend/src/ai/LLMProvider.ts.
| Role | Provider | Model |
|------|----------|-------|
| Primary | OpenAI | gpt-5.4-mini |
| Fallback | Anthropic | claude-haiku-4-5-20251001 |
The fallback kicks in automatically on transient errors (429, 5xx, timeouts, network failures). If the primary fails mid-stream before any tokens are emitted, the fallback takes over seamlessly.
AI Features
- Brain dump parsing -- extracts tasks and habits from freeform text
- Weekly review -- generates a coached summary of the past 7 days
- Habit suggestions -- recommends habits based on a goal
- Reshuffle by energy -- reschedules tasks around predicted energy windows
- Pattern spotting -- analyses 60 days of data for behavioural patterns (Pro plan only)
- AI chat -- streaming conversational assistant with live user context
Sentry Monitoring
Two Sentry projects under the mysa-digital organisation:
| Project | Platform | DSN env var |
|---------|----------|-------------|
| buzzboard-backend | Express | SENTRY_DSN |
| buzzboard-frontend | React | VITE_SENTRY_DSN |
VITE_SENTRY_DSN is baked into the frontend at build time by Vite, so a full rebuild is required when changing it.
Deployment Process
Full rebuild and redeploy (backend + frontend changes)
ssh [email protected]
cd ~/buzzboard
git pull origin main
# Build backend
cd ~/buzzboard/buzzboard-hosted/packages/backend
npx prisma generate --schema=prisma/schema.prisma
pnpm build
# Build frontend
cd ~/buzzboard/buzzboard-hosted
pnpm --filter @mysa/buzzboard-hosted-frontend build
# Rebuild and restart containers
cd ~/buzzboard/buzzboard-hosted
docker compose up -d --build
# Commit
cd ~/buzzboard
git add .
git commit -m "your message"
git push origin mainBackend-only changes (no frontend changes)
cd ~/buzzboard/buzzboard-hosted/packages/backend
pnpm build
cd ~/buzzboard/buzzboard-hosted
docker compose up -d --buildEnvironment variable changes only (no code changes)
# Edit the env file
nano ~/buzzboard/buzzboard-hosted/.env.production
# Restart containers (no rebuild needed)
cd ~/buzzboard/buzzboard-hosted
docker compose down && docker compose up -dFrontend-only changes
cd ~/buzzboard/buzzboard-hosted
pnpm --filter @mysa/buzzboard-hosted-frontend build
docker compose up -d --buildComponent Library
The shared UI component library is published to npm as @mysadigital/buzzboard-ui.
To publish updates:
# From the monorepo root on your Mac
cd ~/buzzboard
# Bump version in root package.json first, then:
pnpm build
npm publish --access publicThen update the version reference in buzzboard-hosted/packages/frontend/package.json and redeploy.
Git Config (mysaserv)
user.name = Reece Preston
user.email = [email protected]Useful Commands
# Check container status
docker ps
# View backend logs
docker logs buzzboard-hosted-backend-1 --tail 50 -f
# View frontend logs
docker logs buzzboard-hosted-frontend-1 --tail 50 -f
# Restart a single container
docker restart buzzboard-hosted-backend-1
# Connect to MySQL
docker exec -it buzzboard-hosted-mysql-1 mysql -u buzzboard -p buzzboard
# Run Prisma migrations
cd ~/buzzboard/buzzboard-hosted/packages/backend
npx prisma migrate deploy --schema=prisma/schema.prismaAuth Flow
- Email/password, Google OAuth and GitHub OAuth all working
- OAuth callback URLs:
https://buzzboard.mysa.live/api/v1/auth/oauth/google/callbackand.../github/callback - Sessions stored in Redis, cookies scoped to
buzzboard.mysa.live
Last updated: 22 April 2026
