A comprehensive SaaS platform for collecting and showcasing customer testimonials, featuring video recording, approval workflows, and embeddable testimonial walls.
- .NET 8 SDK
- Node.js 18+
- PNPM 8+
- Docker & Docker Compose (optional)
-
Clone the repository
git clone https://github.com/yourusername/trustloops.git cd trustloops
-
Install frontend dependencies
pnpm install
-
Set up environment variables
Copy
src/WebApp/appsettings.json
and update with your Supabase credentials:{ "Supabase": { "Url": "https://your-project.supabase.co", "AnonKey": "your-anon-key", "JwtSecret": "your-jwt-secret" } }
-
Run the development servers
Backend (API):
cd src/WebApp dotnet run
Frontend (React):
cd apps/web pnpm dev
-
Access the application
- Frontend: http://localhost:5173
- Backend API: http://localhost:5000
- Swagger UI: http://localhost:5000/swagger
Backend:
- ASP.NET Core 8 Minimal API
- Supabase (Auth, Database, Storage)
- Serilog for logging
- FluentResults for error handling
- xUnit for testing
Frontend:
- Vite + React 18 + TypeScript
- Tailwind CSS for styling
- React Router for navigation
- React Query for state management
- React Hook Form for forms
Infrastructure:
- Docker for containerization
- Fly.io for deployment
- GitHub Actions for CI/CD
- PNPM workspaces for monorepo
trustloops/
βββ apps/
β βββ web/ # React frontend application
βββ src/
β βββ WebApp/ # ASP.NET Core API
β βββ Shared/ # Shared models and utilities
β βββ Infrastructure/ # Data access and external services
βββ tests/
β βββ WebApp.Tests/ # Backend unit tests
βββ build/
β βββ pack.ps1 # Build and deployment scripts
βββ .github/workflows/ # CI/CD pipelines
- Video Recording: Browser-based video testimonial recording
- Text Testimonials: Simple form-based text testimonials
- Approval Workflow: Review and approve testimonials before publishing
- Embeddable Wall: Responsive testimonial showcase for websites
- Magic Link Auth: Passwordless authentication via Supabase
- Project Management: Organize testimonials by project/product
- StatusLoops: Internal status page management
- ShotLoops: Batch screenshot beautification API
- Analytics: Testimonial performance tracking
- Integrations: Webhooks, Zapier, API access
- Themes: Customizable testimonial wall designs
Frontend development:
pnpm dev # Start dev server
pnpm build # Build for production
pnpm test # Run tests
pnpm lint # Lint code
Backend development:
dotnet run # Start API server
dotnet test # Run tests
dotnet build # Build solution
Docker development:
docker-compose up # Start all services
docker-compose down # Stop all services
# Build everything
./build/pack.ps1 -BuildFrontend -BuildBackend
# Build and create Docker image
./build/pack.ps1 -BuildDocker
# Deploy to production
./build/pack.ps1 -Deploy -Environment Production
Create a .env
file in the frontend:
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key
VITE_API_URL=https://your-api.fly.dev
-
Install Fly.io CLI
iwr https://fly.io/install.ps1 -useb | iex
-
Login and deploy
fly auth login fly deploy
The application uses Supabase for managed PostgreSQL. Set up these tables:
users
- User accounts and subscription infoprojects
- Testimonial collection projectstestimonials
- Individual testimonials with approval status
Backend tests:
dotnet test --verbosity normal
Frontend tests:
cd apps/web
pnpm test
Integration tests:
docker-compose -f docker-compose.test.yml up --abort-on-container-exit
The API is documented with Swagger/OpenAPI. When running locally:
- Swagger UI: http://localhost:5000/swagger
- OpenAPI spec: http://localhost:5000/swagger/v1/swagger.json
GET /health
- Health checkPOST /api/testimonials
- Upload testimonial (multipart)GET /api/testimonials/{projectId}
- Get project testimonialsPUT /api/testimonials/{id}/approve
- Approve testimonialGET /api/projects
- Get user projectsPOST /api/projects
- Create new project
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
Built with β€οΈ for the developer community