A modern feedback management platform built with Nuxt 3, TypeScript, and shadcn-vue. Veerify helps you collect, organize, and prioritize user feedback to build better products - similar to Sleekplan, Canny, and Featurebase.
- Feedback Collection - Capture user feedback and feature requests
- Voting System - Let users upvote their favorite features
- Status Management - Track feedback from submission to completion
- Team Collaboration - Role-based access with team management
- Analytics Dashboard - Insights into user engagement and feedback trends
- Public Roadmap - Share your product development timeline
- User Management - Organize and segment your user base
- Nuxt 3 - The Intuitive Vue Framework
- TypeScript - Static type checking
- shadcn-vue - Beautifully designed components built with Radix Vue and Tailwind CSS
- Tailwind CSS - Utility-first CSS framework
- Vue 3 - The Progressive JavaScript Framework
- Reka UI - Vue port of Radix UI primitives
- Lucide Vue - Beautiful hand-crafted SVG icons
- VueUse - Collection of essential Vue composition utilities
- Node.js 18+
- Yarn package manager
Install dependencies using yarn:
yarn installThe repository includes an explicit AI harness so coding agents can bootstrap context and run deterministic checks.
# Print key context and git snapshot
yarn harness:context
# Validate agent docs map + run quality gates
yarn harness:verifyyarn harness:verify runs:
yarn typecheckyarn testyarn lintyarn test:e2e:if-available(guarded Playwright runner)
Chrome DevTools MCP for Codex:
# One-time local setup
yarn codex:mcp:chrome:setup
# Deterministic per-worktree app URL/port
yarn worktree:env
# Run app bound to the worktree-specific port
yarn dev:worktreeyarn devdocker compose -f docker-compose-dev.yml up -dThis starts:
- PostgreSQL on
localhost:5432 - Mailpit SMTP/UI on
localhost:1025andlocalhost:8025 - MinIO API/Console on
localhost:9000andlocalhost:9001
The development environment includes Mailpit, a local SMTP server and web interface for testing emails during development.
When you run the development docker compose, Mailpit will be available at:
- Web Interface: http://localhost:8025 - View sent emails in a web UI
- SMTP Server:
localhost:1025- Configure your app to send emails here
SMTP Configuration for Development:
Create a .env file in your project root with these settings:
# Email Configuration for Mailpit (Development)
MAIL_FROM="noreply@veerify.local"
SMTP_HOST=localhost
SMTP_PORT=1025
SMTP_SECURE=false
SMTP_USER=
SMTP_PASS=All emails sent by your application during development will be captured by Mailpit and displayed in the web interface, making it easy to test email verification, password resets, and other email functionality without sending real emails.
yarn db:studioyarn buildThe build automatically runs migrations and seeds test data via the postbuild script. Seed is skipped on production (VERCEL_ENV=production).
You can connect to PostgreSQL in two ways:
Option A β single connection string (recommended for hosted databases like Neon):
DATABASE_URL=postgres://user:password@host:5432/dbname?sslmode=requireOption B β individual variables (used by local Docker setup):
PGHOST=localhost
PGPORT=5432
PGUSER=veerify
PGPASSWORD=veerifypassword
PGDATABASE=veerifydbDATABASE_URL takes precedence when both are set.
Use separate domains for the dashboard app and team public boards:
# Dashboard app host (main app)
BETTER_AUTH_URL=https://app.veerify.io
APP_DASHBOARD_DOMAIN=app.veerify.io
# Public board base host (team subdomains)
APP_DOMAIN=veerify.io
# Optional deployment mode override ("self-hosted" or "cloud")
# If omitted, Veerify auto-detects cloud platforms from env vars.
APP_DEPLOYMENT_MODE=self-hostedTo enable GitHub repository connection in product settings, set OAuth credentials:
GITHUB_CLIENT_ID=your-github-oauth-app-client-id
GITHUB_CLIENT_SECRET=your-github-oauth-app-client-secretConfigure the GitHub OAuth app callback URL as https://<your-dashboard-host>/api/auth/callback/github. Veerify uses that Better Auth callback for sign-in and a nested callback below it for product-level GitHub repository authorization.
To enable product logo/banner uploads, configure storage:
# Choose "local" or "s3"
STORAGE_DRIVER=local
# Local mode (self-host/dev default)
STORAGE_LOCAL_DIR=.data/storageS3-compatible mode works with AWS S3, Cloudflare R2, and MinIO:
STORAGE_DRIVER=s3
STORAGE_BUCKET=veerify-assets
STORAGE_REGION=auto
STORAGE_ENDPOINT=
STORAGE_ACCESS_KEY_ID=
STORAGE_SECRET_ACCESS_KEY=
STORAGE_FORCE_PATH_STYLE=false
STORAGE_PUBLIC_BASE_URL=
UPLOAD_TOKEN_SECRET=replace-with-long-random-secretProvider examples:
- AWS S3: leave
STORAGE_ENDPOINTempty, use region likeus-east-1, optionalSTORAGE_PUBLIC_BASE_URLvia CloudFront/custom domain. - Cloudflare R2: set
STORAGE_ENDPOINT=https://<accountid>.r2.cloudflarestorage.com,STORAGE_REGION=auto. - MinIO (self-host): set
STORAGE_ENDPOINT=http://127.0.0.1:9000,STORAGE_FORCE_PATH_STYLE=true.
For local dev with docker-compose-dev.yml, MinIO bootstraps bucket veerify-assets automatically. Use:
STORAGE_DRIVER=s3
STORAGE_BUCKET=veerify-assets
STORAGE_REGION=us-east-1
STORAGE_ENDPOINT=http://127.0.0.1:9000
STORAGE_ACCESS_KEY_ID=minioadmin
STORAGE_SECRET_ACCESS_KEY=minioadmin
STORAGE_FORCE_PATH_STYLE=trueFor local development, start the database with Docker Compose:
docker compose up -dyarn previewTest credentials on preview deployments:
Two seed accounts are available β one with a full org/team/project setup, one standalone personal account with no org affiliation:
| Account | Password | Has org? | |
|---|---|---|---|
| Org user | test@preview.local |
password123 |
Yes |
| Personal | personal@preview.local |
password123 |
No |
veerify/
βββ components/
β βββ sidebar/ # Navigation components
β βββ ui/ # shadcn-vue UI components
βββ layouts/
β βββ clean.vue # Clean layout for auth pages
β βββ dashboard.vue # Main dashboard layout
βββ pages/
β βββ dashboard/ # Main dashboard
β βββ feedback/ # Feedback management
β βββ team/ # Team management
β βββ reports/ # Analytics and reporting
β βββ help/ # Help center
β βββ settings/ # Application settings
βββ scripts/
β βββ seed.ts # Preview database seed (org user + personal user)
βββ assets/css/ # Global styles
This project uses shadcn-vue for UI components. shadcn-vue provides beautifully designed, accessible components that you can copy and paste into your apps.
Unlike traditional component libraries, shadcn-vue components are not installed as dependencies. Instead, you copy the source code directly into your project. This gives you:
- Full ownership of the code - modify components as needed
- No vendor lock-in - components live in your codebase
- Customizable - easily adapt components to your design system
- Tree-shakable - only include what you use
To add a new shadcn-vue component to your project, use the CLI:
# Add a specific component
npx shadcn-vue@latest add button
# Add multiple components
npx shadcn-vue@latest add button card dialog
# List all available components
npx shadcn-vue@latest listComponents will be added to the components/ui/ directory and can be used like any other Vue component. There is no need to import them, as they are automatically imported by Nuxt.
<template>
<div>
<Button variant="default">Submit Feedback</Button>
<Button variant="destructive">Delete</Button>
<Button variant="outline" size="sm">Vote</Button>
</div>
</template>The shadcn-vue configuration is stored in components.json:
- Style: New York design system
- TypeScript: Fully typed components
- Tailwind: Custom CSS variables for theming
- Icons: Lucide icon library integration
- Dashboard (
/dashboard) - Overview of feedback metrics and activity - Feedback (
/feedback) - Main feedback management interface - Analytics (
/reports) - Detailed analytics and insights - Team (
/team) - Team member management and permissions - Help Center (
/help) - User documentation and support - Settings (
/settings) - Application configuration - API Docs (
/api-docs) - Interactive Scalar reference backed by/api/openapi.json
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-only).
- Source code and derivatives must remain under the same license when distributed
- Networked/hosted modified versions must also provide source to users
- Commercial use is permitted under AGPL terms
See LICENSE for the full terms.