A shareable birthday card that counts down to the recipient's estimated death date instead of celebrating another year survived. Built as a dark-humour take on the traditional e-card.
- Enter the recipient's name, date of birth, and gender.
- Pick one of four visual card styles.
- Preview the card — it shows a live countdown timer (days, hours, minutes, seconds) to the estimated death date.
- Submit to generate a permanent shareable link.
- The death date is calculated on the server using WHO life expectancy statistics.
- Cards automatically expire and are cleaned up after their TTL.
- 3-step creation wizard — intro → form → style, state persisted in URL query params so a page refresh never loses progress
- 4 card styles — Standard, Official, Vintage, Elegant
- Life countdown — real-time timer ticking down to the estimated death date
- WHO-based estimation — life expectancy differs by gender (71 years male / 76 years female, WHO 2024)
- Dark / light theme — persisted in
localStorage - Multilingual — Russian and English, persisted in
localStorage - SSR — server-side rendering for fast initial load and proper meta tags
- Auto-expiry — a background service deletes expired cards every hour
| Layer | Technology |
|---|---|
| Frontend | Angular 21 · Taiga UI v5 · ngx-translate v17 |
| Rendering | Angular SSR (server-side rendering) |
| Backend | ASP.NET Core · .NET 10 · Entity Framework Core |
| Database | PostgreSQL 17 |
docker-compose up -dcd backend
dotnet ef database update # apply migrations
dotnet runThe API will be available at http://localhost:5209.
cd frontend
npm install
npm startThe app will be available at http://localhost:4200.
cd frontend
npm start # dev server with SSR
npm run build # production build
npm test # unit testsEnvironment config lives in src/environments/. The dev environment points the API client at http://localhost:5209/api.
cd backend
dotnet run # start the API
dotnet ef migrations add <Name> # create a new migration
dotnet ef database update # apply pending migrationsCORS in development allows http://localhost:4200. To change, update appsettings.Development.json.
happy-deathday/
├── frontend/ # Angular 21 SSR app
│ └── src/app/
│ ├── core/ # singleton services (CardApi, CardStateService, LanguageService …)
│ ├── features/ # routed pages (card display, 404)
│ ├── layouts/
│ │ └── public/
│ │ └── components/
│ │ ├── create-intro/ # step 1 — landing / description
│ │ ├── create-form/ # step 2 — name, birth date, gender
│ │ ├── create-style/ # step 3 — style picker
│ │ └── card-preview/ # review & submit
│ └── shared/ # reusable components and interfaces
├── backend/ # ASP.NET Core Web API
│ ├── Controllers/ # HTTP endpoints
│ ├── Models/ # EF Core entities
│ ├── Dtos/ # request / response shapes
│ ├── Services/ # business logic
│ └── Infrastructure/ # background services, exception handling
└── docker-compose.yml # PostgreSQL for local development
| Path | Component | Description |
|---|---|---|
/public/create/intro |
CreateIntro | Landing page with CTA |
/public/create/form |
CreateForm | Name, birth date, gender |
/public/create/style |
CreateStyle | Style picker |
/public/card-preview |
CardPreview | Review and submit |
/card/:id |
Card | Shareable card with timer |
| Method | Path | Description |
|---|---|---|
POST |
/api/card |
Create a card, returns the card with ID |
GET |
/api/card/:id |
Fetch a card by ID |
Cards include an expiresAt timestamp. Expired cards are deleted automatically.