Stateless, database-free business card generator that ingests employee data from Excel, merges it into PowerPoint templates with OpenXML, and generates QR codes for vCards. Built with Blazor Server for a fast, secure, and easy-to-deploy solution.
🌐 Live Demo: cardmaker.hyunjo.uk
- Excel import (xlsx) using the provided template headers (Name, Position, Email, etc.); no database writes.
- PowerPoint card generation with formatting preservation via
DocumentFormat.OpenXml. - QR code generation that embeds vCard data into the PPT template’s
{qrcode}placeholder. - Security-first defaults in the web host (CSP, rate limiting, health checks).
- Docker- and compose-ready; Apache 2.0 licensed.
src/
BusinessCardMaker.Core/ # Core models, config DTOs, OpenXML services
BusinessCardMaker.Web/ # Blazor Server host, DI setup, components, static assets
tests/
BusinessCardMaker.Tests/ # xUnit test project (Moq available)
BusinessCardMaker.E2ETests/ # Playwright E2E tests
Dockerfile.web # Production image for the web app
docker-compose.yml # Local container runner
Prereqs: .NET 10 SDK, Node not required, Docker optional.
# Restore and build everything
dotnet build BusinessCardMaker.slnx
# Run the web app
dotnet run --project src/BusinessCardMaker.Web --urls http://localhost:5049
# browse http://localhost:5049
# Tests (add tests under tests/BusinessCardMaker.Tests)
dotnet test BusinessCardMaker.slnx
# Docker
docker compose up --build # or: docker build -f Dockerfile.web -t cardmaker:latest .
docker run -p 5049:5049 cardmaker:latest- Excel template downloads directly from the UI (Step 1).
- PowerPoint template is served as a static file:
wwwroot/templates/CardMaker_Template.pptx(includes QR placeholder).
- Core services live in
src/BusinessCardMaker.Core/Services(Importfor Excel ingestion,CardGeneratorfor PPT output). All services are DI-friendly. - Web host wiring is in
src/BusinessCardMaker.Web/Program.cs; components live underComponents/with layouts and shared pieces separated. - Configuration uses
appsettings*.jsonwithBusinessCardsections for processing limits and template mapping. Keep secrets out of source; prefer environment variables for overrides. - Keep the stateless philosophy: no DB writes, no user accounts, clear data at session end.
CardMaker uses the following open-source libraries:
- DocumentFormat.OpenXml 3.2.0 - MIT License
- QRCoder 1.7.0 - MIT License
- .NET 10 - MIT License
Issues and PRs are welcome! Please keep changes small, tested, and documented.