A discord bot for teal.fm
discord
tealfm
music
1# Disco Stu - Teal.fm Discord Bot
2
3This repository contains the Disco Stu Discord bot, supporting services, and shared packages used by the project. The workspace is a monorepo managed with pnpm and TypeScript; each app and package has its own package.json and build/dev scripts.
4
5**Repository Structure**
6
7- `apps/` : Application code (runtime programs and services)
8 - `bot/` : Discord bot (commands, deploy script)
9 - `tapper/` : Backfill client for Tap service
10 - `web/` : Web server to handle OAuth
11- `packages/` : Shared libraries used across apps
12 - `common/` : Logging and shared utilities
13 - `database/` : Database access, Kysely migrations and seed scripts
14 - `tsconfig/` : Shared TypeScript config packages
15
16**Apps**
17
18- `apps/bot` — Discord bot
19 - Entry: `apps/bot/main.ts`.
20 - Key files: `apps/bot/commands/*.ts` (command handlers), `apps/bot/deploy-commands.ts` (registers commands with Discord), `apps/bot/discord.d.ts` (types).
21 - Useful scripts (see [apps/bot/package.json](apps/bot/package.json)):
22 - `dev` — run bot in watch mode with `tsx --watch main.ts`
23 - `deploy-commands` — run `deploy-commands.ts` to push slash-command definitions to Discord
24 - `build` — compile TypeScript to `dist/`
25 - `start` — run compiled bot from `dist/main.js`
26
27- `apps/tapper` — Tap client
28 - Entry: `apps/tapper/index.ts`.
29 - Purpose: Interact with tap service running at https://tap.xero.systems
30 - Useful scripts (see [apps/tapper/package.json](apps/tapper/package.json)):
31 - `dev` — runs `NODE_ENV=development tsx index.ts`
32 - `start` — run compiled `dist/index.js` in production
33
34- `apps/web` — Web server
35 - Entry: `apps/web/index.ts`.
36 - Integrates with AT Protocol APIs and provides OAuth/web endpoints.
37 - Useful scripts (see [apps/web/package.json](apps/web/package.json)):
38 - `dev` — `tsx --watch index.ts` to run in dev
39 - `build` — compile TypeScript
40 - `start` — run compiled server from `dist/index.js`
41
42**Packages**
43
44- `packages/common` — shared utilities and logging
45 - Exports logging helpers and other common utilities used by apps. Build with `pnpm --filter @tealfmbot/common build` or use workspace protocol.
46 - Scripts: `build`, `build:watch`, `typecheck` (see [packages/common/package.json](packages/common/package.json)).
47
48- `packages/database` — Kysely-based database layer
49 - Contains DB helpers, `migrate.ts`, `seed.ts`, and Kysely codegen support.
50 - Scripts (see [packages/database/package.json](packages/database/package.json)):
51 - `migrate` — run `kysely migrate latest` to apply migrations
52 - `codegen` — run `kysely-codegen` to regenerate `database.d.ts`
53 - `seed` — run `tsx seed.ts` to seed data
54 - `build`, `build:watch`, `typecheck`
55
56- `packages/tsconfig` — shared TypeScript configs
57 - Provides base tsconfig settings shared by other packages.
58
59**Top-level scripts** (see [package.json](package.json))
60
61- `pnpm bot` — start the bot dev script (`pnpm --filter bot dev`)
62- `pnpm tap` — start the tapper dev script (`pnpm --filter tapper dev`)
63- `pnpm web` — start the web app dev script (`pnpm --filter web dev`)
64- `pnpm build` — run `pnpm -r build` to build all packages and apps
65- `pnpm build:watch` — run watch builds across the monorepo
66- `pnpm dev:all` — runs `dev` for all apps under `apps/`
67- `pnpm typecheck` — run TypeScript checks across apps
68- `pnpm lint` — run `oxlint` (project linter)
69- `pnpm format` — run `oxfmt` to format code
70
71Developer workflow
72
73- Install dependencies: `pnpm install` (pnpm v10+ recommended)
74- Develop a single app:
75 - Bot: `pnpm --filter bot dev` or `pnpm bot`
76 - Tapper: `pnpm --filter tapper dev` or `pnpm tap`
77 - Web: `pnpm --filter web dev` or `pnpm web`
78- Develop all apps concurrently: `pnpm dev:all`
79- Build all packages and apps: `pnpm build`
80
81Database tasks
82
83- Migrations are managed via Kysely. Run migrations from the `packages/database` package:
84
85```bash
86pnpm --filter @tealfmbot/database migrate
87```
88
89- Regenerate types (codegen):
90
91```bash
92pnpm --filter @tealfmbot/database codegen
93```
94
95Docker / deployment
96
97- `Dockerfile` and `docker-compose.prod.yml` are included for building and deploying container images.
98- The repository contains `build-and-publish-images.sh` to build and publish images (will be a CI thing eventually).
99
100Project tooling
101
102- `lefthook.yml` configures git hooks.
103- `oxlint` and `oxfmt` are used for linting and formatting.
104
105Notes & tips
106
107- To deploy Discord commands after changes, run the bot package `deploy-commands` script:
108
109```bash
110pnpm --filter bot deploy-commands
111```
112
113**Contributing & Quickstart**
114
115If you want to contribute or get a local development environment running quickly, follow these steps:
116
117- Clone the repo and install dependencies:
118
119```bash
120git clone https://tangled.org/dane.is.extraordinarily.cool/tealfmbot
121cd tealfmbot
122pnpm install
123```
124
125- Start and run database migrations
126
127```bash
128docker compose -f docker-compose.dev.yml up -d
129
130cd packages/database
131
132pnpm migrate
133```
134
135- Start individual apps in development:
136
137```bash
138# Bot
139pnpm bot
140
141# Tapper
142pnpm tap
143
144# Web
145pnpm web
146```
147
148- Start all apps concurrently (monorepo dev):
149
150```bash
151pnpm dev:all
152```
153
154- Build everything:
155
156```bash
157pnpm build
158```
159
160- Run TypeScript checks and format/lint before opening a PR:
161
162```bash
163pnpm typecheck
164pnpm lint
165pnpm format
166```
167
168Please open issues or PRs for new features, and include clear reproduction steps and expected behavior.