GuildPass is a web dashboard for managing access, passes, guilds/communities, members, and activity.
- Dashboard overview with key stats
- Pass management
- Guild/community management
- Member management with wallet info
- Activity/audit log
- Settings page
- Mock data for easy local development
- Next.js 14 – Full-stack React framework
- TypeScript – Type-safe code
- Tailwind CSS – Utility-first CSS
- pnpm – Fast, disk-efficient package manager
- Monorepo structure with packages/integration-client shared types
- Node.js 18.17 or later
- pnpm (install via
npm install -g pnpm)
# Clone or navigate to the project directory
cd guildpass-app
# Install all dependencies
pnpm installTo receive live activity updates in the dashboard, you must configure a webhook secret.
- Set the
WEBHOOK_SECRETenvironment variable inapps/dashboard/.env.local. - Incoming webhooks should be sent to
/api/webhooks. - Webhooks must include the
x-guildpass-signatureheader for verification.
Example .env.local:
WEBHOOK_SECRET=your_secret_heremembership.createdmembership.updatedpass.createdpass.updatedguild.updatedverification.completed
Run the local development server:
pnpm devThen open http://localhost:3000 in your browser.
Create an optimized production build:
pnpm buildThen start the production server:
pnpm start- Type check all packages and apps:
pnpm typecheck - Run linter:
pnpm lint
guildpass-app/
├── apps/
│ ├── dashboard/ # Main Next.js dashboard app (NEW!)
│ ├── discord-bot/ # Optional Discord bot integration (legacy)
│ └── docs/ # Docusaurus docs (legacy)
├── packages/
│ ├── integration-client/ # Shared types and API client
│ └── webhook-utils/ # Webhook verification utilities (optional)
├── .pnpmrc # pnpm configuration
├── pnpm-workspace.yaml # Monorepo workspace config
└── package.json # Root package.json
The @guildpass/webhook-utils package provides production-ready webhook signature verification for GuildPass integrations:
- ✅ HMAC-SHA256 signature verification
- ✅ Replay attack protection with timestamp validation
- ✅ Timing attack resistant
- ✅ Zero dependencies
- ✅ Full TypeScript support
See packages/webhook-utils/README.md for complete documentation and examples.
Quick Example:
import { verifySignature } from "@guildpass/webhook-utils";
const result = verifySignature({
signatureHeader: request.headers.get('x-guildpass-signature'),
secret: process.env.WEBHOOK_SECRET,
payload: rawBody,
});
if (!result.valid) {
return Response.json({ error: result.error }, { status: 401 });
}The dashboard supports two API modes controlled by the DASHBOARD_API_MODE environment variable:
mock(default) — the app uses local mock data for all pages and API routes.live— the app will forward membership and verification lookups to a GuildPass core API via the@guildpass/integration-clientpackage.
To enable live mode, set these environment variables for the dashboard app (server-side only):
# set the dashboard API mode
DASHBOARD_API_MODE=live
# GuildPass core API base URL (required in live mode)
GUILD_PASS_CORE_URL=https://your-core.example.com
# API key for the core (server-side secret)
GUILD_PASS_CORE_API_KEY=supersecret
# webhook secret (if you use webhooks)
WEBHOOK_SECRET=your_webhook_secretNotes:
- Live mode must run on the server-side (Next.js App Router API routes) — the client bundle never receives your
GUILD_PASS_CORE_API_KEY. - The dashboard's API routes perform lookups by
walletordiscordUserIdwhen live mode is enabled (e.g.GET /api/members?wallet=0x...). - Mock mode remains the default for easy local development.
/– Landing page/dashboard– Overview with key stats/passes– Manage passes/guilds– Manage communities/guilds/members– Manage members/activity– View activity log/integrations– Manage integrations & view status (NEW!)/settings– App settings
The Discord bot (apps/discord-bot) is preserved as an optional integration and not required for the dashboard to function. The dashboard exposes an integration status UI to check if the bot is configured and healthy.
Health-Check Contract: For a live production environment, the integration adapter checks the bot's health using two strategies:
- Microservice Health Endpoint: If
DISCORD_BOT_STATUS_URLis set, the dashboard will ping the bot's HTTP health endpoint (e.g.,GET /health). It expects a JSON response containingstatus: "healthy"orgatewayConnected: true. - Discord REST API: If no endpoint is configured, the dashboard falls back to directly pinging the Discord API (
GET https://discord.com/api/v10/guilds/{guildId}) using the providedDISCORD_TOKEN.
- All data is currently mock data (see
apps/dashboard/lib/mock-data.ts). - The docs site (
apps/docs) is also preserved as optional legacy documentation.
MIT — see LICENSE.