Hub
This website allows users to have a page which contains all their talks and sessions.
They can host their own presentations for 72h.
To host your own slidesk.link hub, you have to clone it and:
- Create a
.envfile with this following keys:
GITHUB_OAUTH_CLIENT_ID=
GITHUB_OAUTH_CLIENT_SECRET=
JWT_SECRET=YOUR_SECRET
# Optional: where the sqlite file lives (default: ./app/dev.db).
DATABASE_PATH=./app/dev.db
- install it
bun install
bun webThe sqlite file is created and migrated on startup, so there is no separate migration command.
The deployed app exposes the addon hub to AI agents at /mcp over
Streamable HTTP — nothing to clone, nothing to run:
claude mcp add --transport http slidesk-addons https://slidesk.link/mcpThe endpoint is stateless (one POST, one JSON reply, no session identifier), and
install_addon there only ever returns the command — installing touches the
user's own SliDesk project, so a local stdio server (bun run mcp) is what
actually runs it. See mcp/README.md.
Migrations live in src/database/migrations as plain .sql files and are
applied on startup, tracked by sqlite's PRAGMA user_version. Each one runs in
its own transaction, and a database already at the latest version does no work.
To add one:
- create
src/database/migrations/NNN_short_name.sql; - append it to the
MIGRATIONSarray insrc/database/migrations/index.tswith the next version number.
Migrations are imported statically so their SQL is embedded in the server
bundle. Because they run inside a transaction they cannot toggle
PRAGMA foreign_keys, which the app enables at startup.
bun run build # both of the below
bun run build:client # vite -> dist-client
bun run build:server # bun build -> dist-server/index.jsThe server bundle inlines every dependency and emits the native resvg addon
beside it, so the Docker release image ships only dist-server, dist-client,
public and app — no sources and no node_modules.