diceshock-behover/
├── apps/
│ ├── runespark/ # Runespark app (GraphQL + React)
│ └── diceshock/ # Diceshock app
├── libs/
│ ├── db/ # Shared database library (Drizzle ORM)
│ └── utils/ # Utility functions library
├── plugins/ # Vite plugins
└── drizzle/ # Database migrations
- Runtime: Cloudflare Workers
- Framework: Hono
- Frontend: React 19 + TanStack Router
- GraphQL: Pothos + gqty + GraphQL Workers Subscriptions
- Database: Drizzle ORM + D1 (SQLite)
- Build Tools: Vite + Nx
- Code Quality: Biome
- Package Manager: pnpm (workspaces)
pnpm installRun applications using Nx:
# Run runespark app
pnpm x runespark:dev
# Run diceshock app
pnpm x diceshock:devpnpm x runespark:build
pnpm x diceshock:buildpnpm x runespark:preview
pnpm x diceshock:previewpnpm x runespark:deploy
pnpm x diceshock:deploypnpm drizzle# Apply subscriptions database migrations
pnpm x runespark:migrations:subscriptionsGenerate types based on Worker configuration:
pnpm x runespark:cf-typegenUse CloudflareBindings type in your code:
import type { CloudflareBindings } from "./worker-configuration";
const app = new Hono<{ Bindings: CloudflareBindings }>();Types are automatically generated in development mode when GraphQL schema changes. You can also run manually:
pnpm x runespark:exec -- gqty generatepnpm lintpnpm lint --write- Cloudflare Workers:
apps/{app}/wrangler.toml - Database:
drizzle.config.ts - TypeScript:
tsconfig.base.jsonandapps/{app}/tsconfig.json