Version: 1.2 Date: December 16, 2025 Status: Approved Author: Sarah (Product Owner)
- Deliver a production-ready, Blazor-native blogging engine on .NET 10 LTS
- Provide a clean, educational reference implementation for .NET developers learning Blazor
- Enable rapid customization through CSS variable-based theming (no code changes required)
- Support multi-author workflows with a 5-tier role system (Admin, Editor, Author, Contributor, Reader)
- Achieve "clone to production" timeline of under 1 week for competent .NET developers
- Migrate from legacy stack (MySQL, Blazorise, .NET 9) to modern stack (PostgreSQL, Fluent UI, .NET 10)
TechieBlog 2.0 addresses a gap in the .NET ecosystem: there is no simple, Blazor-native blogging solution that developers can clone, understand, and customize. Current options force developers to either integrate heavyweight CMS platforms (WordPress, Ghost) requiring separate infrastructure, or build from scratch without reference architecture.
This project serves dual purposes: (1) a practical blogging engine for personal/client projects, and (2) an educational resource demonstrating Blazor best practices. The codebase is intentionally designed for readability over cleverness, with a clean 5-project architecture that developers can understand in under an hour. With .NET 10 LTS releasing and Blazor maturing as a production framework, this is the optimal time to establish the definitive Blazor blogging starter.
| Date | Version | Description | Author |
|---|---|---|---|
| 2025-12-16 | 1.0 | Initial PRD created from Project Brief | Sarah (PO) |
| 2025-12-16 | 1.1 | Added Stories 1.13, 1.14, 6.7 per checklist validation | Sarah (PO) |
| 2025-12-16 | 1.2 | Updated Epic 1 stories to reference specific mockup files for HTML-to-Blazor conversion | Sarah (PO) |
- FR1: The system shall provide email/password authentication using JWT tokens
- FR2: The system shall support 5 user roles: Admin, Editor, Author, Contributor, Reader
- FR3: The system shall allow self-service user registration for readers
- FR4: The system shall provide email-based password reset functionality
- FR5: The system shall enforce role-based access control on all protected resources
- FR6: The system shall provide full CRUD operations for blog posts
- FR7: The system shall include a Markdown editor with live preview for content creation
- FR8: The system shall support organizing posts with categories and tags
- FR9: The system shall allow saving posts as drafts before publishing
- FR10: The system shall provide post preview functionality before publishing
- FR11: The system shall support scheduling posts for future publication
- FR12: The system shall allow grouping related posts into series/collections
- FR13: The system shall allow logged-in users to comment on posts
- FR14: The system shall provide comment moderation capabilities for authorized roles
- FR15: The system shall allow logged-in users to rate posts (1-5 stars)
- FR16: The system shall allow users to change their rating on a post
- FR17: The system shall allow readers to favorite/bookmark posts
- FR18: The system shall allow uploading and managing images
- FR19: The system shall support configurable storage backends (network/cloud storage)
- FR20: The system shall provide a subscribe form to capture email addresses
- FR21: The system shall store and manage subscriber lists
- FR22: The system shall allow sending newsletters directly from the application
- FR23: The system shall support manual export of subscriber lists
- FR24: The system shall track total and unique post views
- FR25: The system shall identify and display popular posts
- FR26: The system shall display engagement statistics (comments, ratings) per post
- FR27: The system shall auto-generate RSS feeds for syndication
- FR28: The system shall auto-generate sitemap.xml
- FR29: The system shall implement CSS variable-based theming for all visual properties
- FR30: The system shall support user-controlled light/dark mode toggle (stored in localStorage/user preferences)
- FR31: The system shall include 3 pre-built site themes for public pages (Fluent Modern, Developer Dark, Minimal Clean)
- FR32: Each site theme shall include both light and dark mode variants
- FR33: The system shall support admin-selectable site theme via Site Settings
- FR34: Light/dark mode toggle shall be prominently displayed in the header on all pages
- FR35: The system shall provide a statistics overview dashboard (post counts, user counts, engagement)
- FR36: The system shall provide content management interfaces for posts, comments, and users
- FR37: The system shall provide site configuration settings interface including theme selection
- NFR1: Pages shall load within 2 seconds on standard broadband connections
- NFR2: The application shall support at least 100 concurrent users
- NFR3: A developer shall be able to clone, build, and run locally in under 5 minutes
- NFR4: A developer shall understand the project structure in under 1 hour of code review
- NFR5: Theme customization (colors, fonts) shall be achievable in under 4 hours
- NFR6: Full deployment to production shall be achievable in under 1 week
- NFR7: All passwords shall be hashed with salt using industry-standard algorithms
- NFR8: All database queries shall use parameterized queries to prevent SQL injection
- NFR9: HTTPS shall be enforced in production environments
- NFR10: Rate limiting shall be implemented on authentication endpoints
- NFR11: All user input shall be validated to prevent XSS and injection attacks
- NFR12: Codebase shall follow clean architecture principles with clear separation of concerns
- NFR13: Code shall be readable and well-documented to serve as educational reference
- NFR14: Project shall use a 5-project structure for clear modularity
- NFR15: The application shall support modern browsers (Chrome, Firefox, Edge, Safari)
- NFR16: The application shall be deployable to any .NET-capable hosting environment
- NFR17: The system shall use PostgreSQL as the primary database
- NFR18: Database migrations shall be managed via DbUp
A clean, modern, distraction-free blogging experience that prioritizes content readability for readers and efficient content management for authors. The interface should feel professional yet approachable, with clear visual hierarchy and intuitive navigation. The admin experience should be functional and organized without overwhelming complexity.
- Content-First Design: Minimal chrome, maximum focus on blog content
- Progressive Disclosure: Simple views with advanced options available on demand
- Responsive Layouts: Seamless experience across desktop, tablet, and mobile
- Fluent Design Language: Consistent use of Microsoft Fluent UI components throughout
- Instant Feedback: Real-time preview for Markdown editing, immediate visual feedback for user actions
- Home Page — Featured posts, recent posts, category navigation
- Blog Post Page — Full article view with comments, ratings, related posts
- Category/Tag Archive — Filtered post listings
- Series View — Grouped posts in reading order
- Search Results — Post search with filtering
- Author Profile — Author bio and their posts
- Registration/Login — User authentication screens
- User Profile — Reader's favorites, comment history
- Post Editor — Markdown editor with preview, metadata, scheduling
- Post List (My Posts) — Author's posts with status filters
- Media Library — Image upload and management
- Draft Preview — Full preview of unpublished content
- Admin Dashboard — Statistics overview, quick actions
- All Posts Management — Full post list with bulk actions
- User Management — User list, role assignment, moderation
- Comment Moderation — Pending comments, approval workflow
- Category/Tag Management — Taxonomy administration
- Subscriber Management — Subscriber list, newsletter composition
- Site Settings — Configuration, theme selection
WCAG AA Compliance — The application shall meet WCAG 2.1 Level AA accessibility standards including:
- Proper heading hierarchy
- Sufficient color contrast ratios
- Keyboard navigation support
- Screen reader compatibility
- Focus indicators on interactive elements
- CSS variable-based theming allows complete visual customization
- No hardcoded colors, fonts, or spacing — all via CSS custom properties
- Pre-built themes demonstrate range of customization possibilities
- Developers can match any brand by modifying theme variables only
Web Responsive — Primary target is web browsers with responsive design supporting:
- Desktop (1200px+)
- Tablet (768px - 1199px)
- Mobile (320px - 767px)
Future consideration for MAUI Blazor Hybrid desktop application (post-MVP).
Monorepo — Single repository containing all projects:
TechieBlog.sln
├── BlogDb/ # PostgreSQL scripts, DbUp migrations
├── BlogModel/ # Models, interfaces, DTOs, constants
├── BlogEngine/ # Business logic, repositories, services
├── BlogUI/ # Razor Class Library (Fluent UI components)
└── TechieBlog/ # Blazor Server host application
Monolith with Clean Architecture — Single deployable unit with clear internal boundaries:
- BlogModel: Domain models, interfaces, DTOs — no dependencies
- BlogEngine: Business logic, repository implementations — depends on BlogModel
- BlogUI: Razor Class Library with all UI components — depends on BlogModel, BlogEngine
- TechieBlog: Host application, DI configuration, entry point — depends on all projects
- BlogDb: Database scripts only — no runtime dependencies
Key Decision: No REST API layer (BlogSvc removed). UI calls BlogEngine services directly for simplicity and performance in a template project.
Unit + Integration Testing:
- Unit tests for BlogEngine services and business logic
- Integration tests for repository layer with test database
- Component tests for critical Blazor UI components
- Manual testing convenience methods for development workflow
- No E2E browser automation for MVP (complexity vs. value for template project)
- .NET 10 LTS: Target framework for long-term support stability
- Blazor Server: Server-side rendering model (not WebAssembly)
- Microsoft Fluent UI Blazor: UI component library replacing Blazorise
- PostgreSQL: Primary database (migrating from MySQL)
- Dapper: Micro-ORM for data access (retained from current stack)
- DbUp: Database migration tool (retained from current stack)
- Serilog: Structured logging framework (retained from current stack)
- JWT Authentication: Built-in authentication without external identity providers
- SMTP: Email delivery for password reset and newsletters (configurable provider)
- Configurable Storage: Abstract file storage interface supporting network/cloud backends
The following epics follow an Agile UI-First approach: Phase 1 establishes infrastructure and creates UI scaffolds from mockups, enabling early visual validation. Subsequent phases implement functionality behind the established UI.
| Epic | Title | Stories | Goal |
|---|---|---|---|
| Epic 1 | Foundation & UI Scaffolding | 14 | Migrate to new tech stack, establish CI/CD, and convert all 28 HTML mockups (mockups/) to Blazor components |
| Epic 2 | Authentication & User Management | 6 | Implement complete authentication system with role-based access |
| Epic 3 | Content Management Core | 8 | Deliver full blog post lifecycle from creation to publication |
| Epic 4 | Engagement & Social Features | 4 | Enable reader interaction through comments, ratings, and favorites |
| Epic 5 | Media, Subscribers & Analytics | 7 | Complete media management, newsletter, and analytics features |
| Epic 6 | SEO, Theming & Production Polish | 7 | Finalize RSS, sitemap, themes, monitoring, and production readiness |
Goal: Establish the modernized technical foundation (.NET 10, PostgreSQL, Fluent UI) and convert all HTML mockups from mockups/ folder into Blazor components. This Agile approach enables early stakeholder feedback on visual design while infrastructure is being validated.
Mockup Reference: The mockups/ folder contains 28 HTML mockups with CSS that serve as the visual specification for all UI pages. Each UI scaffold story references specific mockup files to convert.
Exit Criteria: Solution builds and runs on .NET 10 with Fluent UI, PostgreSQL connected, all mockups converted to Blazor components with navigation working.
As a developer, I want the solution migrated to .NET 10 LTS, so that I have long-term support and access to latest Blazor features.
Acceptance Criteria:
- All project files updated to target .NET 10 (net10.0)
- All NuGet packages updated to .NET 10 compatible versions
- Solution builds without errors or warnings
- Application starts and displays default page
As a developer, I want the REST API layer removed from the solution, so that the architecture is simplified for direct service calls.
Acceptance Criteria:
- BlogSvc project removed from solution
- All references to BlogSvc removed from other projects
- Solution builds successfully without API project
- DI configuration updated to wire UI directly to BlogEngine services
As a developer, I want the database migrated from MySQL to PostgreSQL, so that I have broader hosting compatibility and modern database features.
Acceptance Criteria:
- PostgreSQL database scripts created in BlogDb/PostgresScripts
- All 22 tables migrated with correct PostgreSQL data types
- DbUp configured to run PostgreSQL migrations
- Connection string configuration updated for PostgreSQL
- Application connects to PostgreSQL and runs migrations successfully
As a developer, I want Microsoft Fluent UI Blazor integrated replacing Blazorise, so that I have a modern, Microsoft-supported UI component library.
Acceptance Criteria:
- Blazorise packages removed from solution
- Microsoft.FluentUI.AspNetCore.Components packages installed
- Fluent UI services registered in Program.cs
- Base layout updated to use Fluent UI providers
- Sample page renders with Fluent UI components successfully
As a developer, I want CSS variable-based theming infrastructure established, so that themes can be customized without code changes.
Mockup Reference: Convert CSS from mockups/styles.css, mockups/theme-developer.css, mockups/theme-minimal.css
Acceptance Criteria:
- CSS custom properties file created based on
mockups/styles.cssvariables (colors, fonts, spacing) - "Fluent Modern" theme (default) derived from
mockups/styles.csswith light/dark variants - "Developer Dark" theme derived from
mockups/theme-developer.css - "Minimal Clean" theme derived from
mockups/theme-minimal.css - Theme variables applied to base layout and components
- Theme switching mechanism implemented via configuration
- Documentation comments explain each variable's purpose
As a reader, I want a consistent navigation shell across all pages, so that I can easily navigate the blog.
Mockup Reference: Extract layout structure from mockups/01-home.html (header, footer, sidebar patterns are consistent across all mockups)
Acceptance Criteria:
- Main layout created matching mockup
.layout,.header,.footerstructure - Header with site title/logo, navigation links, theme toggle, and user menu as shown in mockups
- Responsive sidebar navigation matching mockup
.sidebarpattern - Footer with copyright and links matching mockup
.footerstructure - Layout adapts correctly to mobile/tablet/desktop breakpoints per mockup responsive CSS
- All navigation links point to corresponding Blazor pages
- Theme toggle button functional (light/dark mode switching)
As a reader, I want all public-facing pages converted from HTML mockups to Blazor components, so that I can see the visual structure of the blog.
Mockup Reference: Convert the following mockups to Blazor pages:
mockups/01-home.html→ Home pagemockups/02-blog-post.html→ Blog post pagemockups/03-category-archive.html→ Category archive pagemockups/04-tag-archive.html→ Tag archive pagemockups/05-series-view.html→ Series view pagemockups/06-search-results.html→ Search results pagemockups/07-author-profile.html→ Author profile page
Acceptance Criteria:
- Home page converted from
01-home.htmlwith featured posts area, recent posts grid, sidebar - Blog post page converted from
02-blog-post.htmlwith article area, author info, comments section, ratings - Category archive page converted from
03-category-archive.htmlwith filtered post listing - Tag archive page converted from
04-tag-archive.htmlwith filtered post listing - Series view page converted from
05-series-view.htmlwith ordered post listing - Search results page converted from
06-search-results.htmlwith search box and results area - Author profile page converted from
07-author-profile.htmlwith bio and posts - All pages preserve mockup visual fidelity using Fluent UI components where appropriate
- Placeholder content clearly indicates where dynamic content will appear
- Theme variant mockups (
theme2-*.html,theme3-*.html) verified compatible with theme switching
As a user, I want authentication pages converted from HTML mockups to Blazor components, so that I can see the login and registration experience.
Mockup Reference: Convert the following mockups to Blazor pages:
mockups/08-login.html→ Login pagemockups/09-register.html→ Registration pagemockups/10-forgot-password.html→ Forgot password pagemockups/11-reset-password.html→ Reset password page
Acceptance Criteria:
- Login page converted from
08-login.htmlwith email/password form, remember me, forgot password link - Registration page converted from
09-register.htmlwith email, password, confirm password, terms checkbox - Forgot password page converted from
10-forgot-password.htmlwith email input and instructions - Reset password page converted from
11-reset-password.htmlwith new password form - All forms use Fluent UI form components while preserving mockup layout
- Validation styling placeholders in place per mockup design
- Responsive design maintained from mockups for all authentication pages
As a registered user, I want my personal dashboard pages converted from HTML mockups to Blazor components, so that I can see my profile and activity areas.
Mockup Reference: Convert the following mockups to Blazor pages:
mockups/12-user-profile.html→ User profile pagemockups/13-my-favorites.html→ My favorites pagemockups/14-my-comments.html→ My comments pagemockups/15-edit-profile.html→ Edit profile pagemockups/16-change-password.html→ Change password page
Acceptance Criteria:
- User profile page converted from
12-user-profile.htmlwith avatar, bio, settings sections - My favorites page converted from
13-my-favorites.htmlwith bookmarked posts list - My comments page converted from
14-my-comments.htmlwith comment history - Profile edit page converted from
15-edit-profile.htmlwith form fields - Change password page converted from
16-change-password.htmlwith current/new password fields - Navigation between user pages working per mockup link structure
As an author, I want content management pages converted from HTML mockups to Blazor components, so that I can see the post creation and management experience.
Mockup Reference: Convert the following mockups to Blazor pages:
mockups/17-post-editor.html→ Post editor pagemockups/18-my-posts.html→ My posts list pagemockups/19-media-library.html→ Media library pagemockups/20-draft-preview.html→ Draft preview page
Acceptance Criteria:
- Post editor page converted from
17-post-editor.htmlwith title, Markdown editor area, preview pane, metadata sidebar - My posts list page converted from
18-my-posts.htmlwith post table, status filters, action buttons - Media library page converted from
19-media-library.htmlwith upload area, image grid, selection mechanism - Draft preview page converted from
20-draft-preview.htmlshowing full post preview - Category/tag selection components scaffolded per mockup design
- Scheduling controls scaffolded per mockup design
- Series selection component scaffolded per mockup design
As an admin, I want the admin dashboard converted from HTML mockup to Blazor component, so that I can see the administrative overview layout.
Mockup Reference: Convert mockups/21-admin-dashboard.html → Admin dashboard page
Acceptance Criteria:
- Admin dashboard page converted from
21-admin-dashboard.htmlwith statistics cards (posts, users, comments, views) - Quick actions section with common admin tasks per mockup design
- Recent activity feed placeholder per mockup layout
- Charts/graphs placeholders for analytics per mockup design
- Admin-specific navigation sidebar matching mockup structure
- Responsive layout maintained from mockup for admin pages
As an admin, I want all admin management pages converted from HTML mockups to Blazor components, so that I can see the full administrative interface.
Mockup Reference: Convert the following mockups to Blazor pages:
mockups/22-admin-posts.html→ All posts management pagemockups/23-admin-users.html→ User management pagemockups/24-admin-comments.html→ Comment moderation pagemockups/25-admin-categories.html→ Category management pagemockups/26-admin-tags.html→ Tag management pagemockups/27-admin-subscribers.html→ Subscriber management pagemockups/28-admin-settings.html→ Site settings page
Acceptance Criteria:
- All posts management page converted from
22-admin-posts.htmlwith data grid, filters, bulk actions - User management page converted from
23-admin-users.htmlwith user list, role badges, action buttons - Comment moderation page converted from
24-admin-comments.htmlwith pending comments queue, approve/reject actions - Category management page converted from
25-admin-categories.htmlwith category list, add/edit forms - Tag management page converted from
26-admin-tags.htmlwith tag list, merge capability indicator - Subscriber management page converted from
27-admin-subscribers.htmlwith subscriber list, export button, newsletter composer - Site settings page converted from
28-admin-settings.htmlwith configuration sections, save button - All admin pages consistent in styling and navigation per mockup design patterns
As a developer, I want a CI/CD pipeline configured, so that builds, tests, and deployments are automated and reliable.
Acceptance Criteria:
- GitHub Actions workflow file created (.github/workflows/ci.yml)
- Pipeline triggers on push to main/dev branches and pull requests
- Build step compiles all projects successfully
- Test step runs all unit tests with results reporting
- Build artifacts produced for deployment
- Pipeline status badge added to README
- Branch protection rules documented (require passing CI)
As a developer, I want testing frameworks configured, so that I can write and run automated tests.
Acceptance Criteria:
- xUnit test project created (TechieBlog.Tests)
- bUnit package installed for Blazor component testing
- Test project references BlogEngine and BlogUI projects
- Sample unit test for a BlogEngine service method
- Sample component test for a Fluent UI component
- Test database configuration for integration tests (in-memory or test container)
- Test runner configured in CI pipeline
- Code coverage reporting enabled (optional threshold)
Goal: Implement complete authentication system with JWT tokens, 5-tier role-based access control, and user management functionality. Users can register, login, reset passwords, and access role-appropriate features.
Exit Criteria: Full authentication workflow functional, roles enforced, users can self-manage profiles.
As a user, I want to authenticate with email and password, so that I can access protected features.
Acceptance Criteria:
- AuthService implemented with login method accepting email/password
- JWT token generated with appropriate claims (userId, email, roles)
- Token expiration configured (e.g., 24 hours)
- Refresh token mechanism implemented
- Password verification using secure hashing (BCrypt or similar)
- Failed login attempts tracked for rate limiting
- Unit tests for authentication logic
As a visitor, I want to register for an account, so that I can engage with blog content.
Acceptance Criteria:
- Registration endpoint accepts email, password, display name
- Email uniqueness validated
- Password strength requirements enforced (min 8 chars, mixed case, number)
- New users assigned Reader role by default
- Registration form connected to backend service
- Success message displayed with login redirect
- Validation errors displayed inline on form
As a user, I want to reset my forgotten password, so that I can regain access to my account.
Acceptance Criteria:
- Forgot password accepts email and generates reset token
- Reset token stored with expiration (e.g., 1 hour)
- Email sent with reset link (SMTP integration)
- Reset password page validates token and accepts new password
- Password updated and token invalidated on successful reset
- User redirected to login with success message
- Invalid/expired token shows appropriate error
As an admin, I want role-based access control enforced, so that users only access appropriate features.
Acceptance Criteria:
- Five roles defined: Admin, Editor, Author, Contributor, Reader
- Role hierarchy implemented (Admin > Editor > Author > Contributor > Reader)
- Authorization policies created for each permission level
- [Authorize] attributes applied to protected pages/components
- UI elements hidden based on user role
- Unauthorized access returns 403 with appropriate message
- Role permissions documented
As a registered user, I want to manage my profile, so that I can update my information and preferences.
Acceptance Criteria:
- Profile page displays current user information
- Edit profile allows updating display name, bio, avatar URL
- Change password requires current password verification
- Email change requires re-verification (or disabled for MVP)
- Profile updates persisted to database
- Success/error feedback displayed to user
As an admin, I want to manage all users, so that I can maintain the user base.
Acceptance Criteria:
- User list displays all users with pagination
- Search/filter users by name, email, role
- View user details including registration date, last login
- Change user role (with confirmation for privilege escalation)
- Disable/enable user accounts
- Delete user with confirmation (soft delete or hard delete with data handling)
- Audit log entry created for admin actions
Goal: Deliver complete blog post lifecycle including Markdown editing, categories/tags, drafts, scheduling, and series. Authors can create, edit, preview, and publish content efficiently.
Exit Criteria: Full post CRUD working, Markdown editor functional, posts displayable on public pages.
As an author, I want to create, read, update, and delete blog posts, so that I can manage my content.
Acceptance Criteria:
- Create post with title, content, excerpt, slug
- Auto-generate slug from title (with manual override)
- Read post by ID or slug
- Update post with version tracking (updated date)
- Delete post (soft delete with recovery option)
- Post list shows author's posts with status indicators
- Repository and service layer implemented with unit tests
As an author, I want to write posts in Markdown with live preview, so that I can focus on content with formatting flexibility.
Acceptance Criteria:
- Markdown editor component integrated (select appropriate Blazor library)
- Side-by-side or toggle preview mode
- Common formatting toolbar (bold, italic, headers, links, images, code)
- Syntax highlighting in editor
- Preview renders Markdown to HTML accurately
- Editor content syncs with post model
- Auto-save draft while editing (every 30 seconds or on pause)
As an author, I want to organize posts into categories, so that readers can find related content.
Acceptance Criteria:
- Category CRUD operations implemented
- Categories have name, slug, description
- Hierarchical categories supported (parent/child)
- Post can belong to one primary category
- Category selector in post editor
- Category archive page displays posts in category
- Admin can manage all categories
As an author, I want to add tags to posts, so that content is discoverable by topic.
Acceptance Criteria:
- Tag CRUD operations implemented
- Tags have name and slug
- Post can have multiple tags
- Tag input with autocomplete in post editor
- Create new tags inline while editing
- Tag archive page displays posts with tag
- Tag cloud or list component for sidebar
As an author, I want to save drafts and preview before publishing, so that I can refine content before it goes live.
Acceptance Criteria:
- Posts have status: Draft, Published, Archived
- Save as draft doesn't make post public
- Preview draft shows full post rendering (accessible only to author/editors)
- Publish action changes status and sets publish date
- Unpublish returns post to draft status
- Draft indicator visible in post list
- Preview link shareable for editorial review (with token)
As an author, I want to schedule posts for future publication, so that I can plan my content calendar.
Acceptance Criteria:
- Schedule date/time picker in post editor
- Scheduled status distinct from Draft and Published
- Background job publishes posts at scheduled time
- Scheduled posts visible in author's post list with scheduled date
- Edit scheduled post before publication
- Cancel scheduling returns to draft
- Time zone handling documented
As an author, I want to group posts into series, so that readers can follow multi-part content.
Acceptance Criteria:
- Series CRUD operations (name, description, slug)
- Add posts to series with order number
- Series selector in post editor
- Post displays series navigation (previous/next in series)
- Series landing page shows all posts in order
- Series list page shows all available series
- Author can reorder posts within series
As a reader, I want to view published blog posts, so that I can read the content.
Acceptance Criteria:
- Home page displays recent published posts
- Featured posts section highlights selected content
- Individual post page renders full Markdown content
- Post displays author info, publish date, category, tags
- Related posts shown based on category/tags
- Reading time estimate displayed
- Social sharing links (static URLs, no API integration)
- SEO-friendly URLs using slugs
Goal: Enable reader interaction through comments with moderation, star ratings, and favorites. Create community engagement while maintaining content quality through moderation tools.
Exit Criteria: Readers can comment, rate, and favorite posts; admins can moderate content.
As a logged-in reader, I want to comment on posts, so that I can engage with content and community.
Acceptance Criteria:
- Comment form on post page (logged-in users only)
- Comments stored with user reference, post reference, timestamp
- Comments display below post in chronological order
- Comment count shown on post cards/listings
- User can edit their own comments (within time limit)
- User can delete their own comments
- Flat comment structure (no threading for MVP)
As an editor/admin, I want to moderate comments, so that I can maintain discussion quality.
Acceptance Criteria:
- Comments can require approval before display (configurable)
- Moderation queue shows pending comments
- Approve/reject actions with optional reason
- Bulk moderation actions (approve all, reject all selected)
- Reported comments flagged for review
- Moderator can edit comments (with edit indicator)
- Moderator can delete any comment
- Notification to author when comment rejected (optional)
As a logged-in reader, I want to rate posts with stars, so that I can indicate content quality.
Acceptance Criteria:
- 1-5 star rating widget on post page
- Rating stored per user per post (one rating per user)
- User can change their rating
- Average rating displayed on post
- Rating count displayed
- Rating displayed on post cards in listings
- Ratings queryable for "top rated" lists
As a logged-in reader, I want to favorite posts, so that I can easily find them later.
Acceptance Criteria:
- Favorite toggle button on post page and cards
- Favorites stored per user
- My Favorites page lists all favorited posts
- Favorite count optionally displayed on posts
- Remove from favorites functionality
- Favorites sortable by date added
- Visual indicator on favorited posts
Goal: Complete media upload and management, subscriber list functionality with newsletter sending, and analytics tracking. Enable content enrichment and audience growth features.
Exit Criteria: Images uploadable and manageable, subscribers collected and contactable, basic analytics visible.
As an author, I want to upload images for my posts, so that I can include visual content.
Acceptance Criteria:
- Image upload component in media library
- Support common formats (JPG, PNG, GIF, WebP)
- File size validation (configurable max size)
- Images stored via configurable storage provider interface
- Unique filename generation to prevent conflicts
- Upload progress indicator
- Error handling for failed uploads
As an author, I want to manage my uploaded images, so that I can reuse and organize media.
Acceptance Criteria:
- Media library displays uploaded images in grid
- Image details (filename, size, upload date, dimensions)
- Search/filter images
- Delete image with confirmation
- Copy image URL for use in posts
- Insert image directly into post editor
- Pagination for large libraries
As a visitor, I want to subscribe to the blog, so that I can receive updates about new content.
Acceptance Criteria:
- Subscribe form component (email input)
- Email validation
- Duplicate subscription handling
- Subscriber stored in database
- Success confirmation message
- Optional: double opt-in via email confirmation
- Subscribe form placeable in sidebar, footer, or dedicated page
As an admin, I want to manage subscribers, so that I can maintain my mailing list.
Acceptance Criteria:
- Subscriber list with pagination
- Search subscribers by email
- View subscription date
- Remove subscriber manually
- Export subscribers to CSV
- Import subscribers from CSV (optional)
- Subscriber count displayed on dashboard
As an admin, I want to send newsletters to subscribers, so that I can share updates and drive engagement.
Acceptance Criteria:
- Newsletter composer with subject and body
- Rich text or Markdown editor for newsletter content
- Preview newsletter before sending
- Send to all subscribers or filtered segment
- SMTP integration for email delivery
- Sending progress/status indicator
- Basic send history log
- Unsubscribe link included in all emails
As an admin/author, I want to see post view statistics, so that I can understand content performance.
Acceptance Criteria:
- Track page view on each post visit
- Distinguish total views vs unique views (by session/user)
- View count displayed on post (optional, configurable)
- Views visible in admin post list
- View trends over time (optional: simple chart)
- Don't count author's own views (optional)
As an admin, I want to see aggregate analytics, so that I can understand overall blog performance.
Acceptance Criteria:
- Dashboard shows total posts, users, comments, subscribers
- Popular posts list (by views)
- Recent comments activity
- New subscribers count (recent period)
- Engagement stats (avg comments, avg rating per post)
- Simple charts for trends (posts over time, views over time)
- Date range filter for analytics
Goal: Finalize SEO features (RSS, sitemap), complete theme system with pre-built options, and ensure production readiness with documentation and polish.
Exit Criteria: RSS and sitemap functional, themes switchable, documentation complete, production-ready.
As a reader, I want an RSS feed, so that I can subscribe using my feed reader.
Acceptance Criteria:
- RSS 2.0 feed endpoint (/feed or /rss)
- Feed includes recent published posts (configurable count)
- Each item has title, link, description, pubDate, author
- Feed auto-updates when posts published
- RSS link in page header (auto-discovery)
- RSS icon/link in UI
- Valid RSS format (passes validation)
As a search engine, I want a sitemap.xml, so that I can index the blog content.
Acceptance Criteria:
- Sitemap.xml endpoint at /sitemap.xml
- Includes all published posts with lastmod date
- Includes category and tag archive pages
- Includes static pages (about, contact if exist)
- Proper XML sitemap format
- Auto-updates when content changes
- Robots.txt references sitemap location
As a developer, I want 2-3 pre-built themes, so that I can see theming possibilities and choose a starting point.
Acceptance Criteria:
- Light theme fully styled and polished
- Dark theme fully styled and polished
- Accent theme (different color palette) completed
- All themes use only CSS variables (no hardcoded values)
- Theme switching works via configuration
- Each theme visually distinct while maintaining usability
- Theme preview screenshots in documentation
As an admin, I want site settings configurable, so that I can customize the blog for my needs.
Acceptance Criteria:
- Site title and tagline configurable
- Posts per page setting
- Comment moderation toggle
- Theme selection dropdown
- SMTP settings configuration
- Storage provider settings
- Settings persisted to database or config file
- Settings take effect without restart where possible
As a developer, I want clean, documented code, so that I can learn from and customize the project.
Acceptance Criteria:
- Code follows consistent formatting and naming conventions
- Complex logic has explanatory comments
- All public APIs have XML documentation
- README with project overview, features, architecture
- Quick start guide (clone, configure, run)
- Configuration documentation (all settings explained)
- Customization guide (theming, extending)
- No dead code, unused files, or commented-out blocks
As a developer, I want sample data and easy setup, so that I can quickly see the blog in action.
Acceptance Criteria:
- Database seed script with sample data
- Sample posts demonstrating features (Markdown, images, series)
- Sample users for each role
- Sample categories and tags
- Sample comments and ratings
- One-command setup script (or clear manual steps)
- Development vs production configuration documented
As a developer/operator, I want health monitoring and structured logging configured, so that I can detect and diagnose production issues.
Acceptance Criteria:
- Health check endpoint implemented (/health)
- Health check verifies database connectivity
- Health check verifies critical service availability
- Serilog configured with structured logging
- Log levels configurable per environment (Debug for dev, Warning+ for prod)
- Logs include correlation IDs for request tracing
- Console and file sinks configured (with rolling file option)
- Exception logging captures full stack traces
- Health endpoint documented for monitoring integration
Validation Date: December 16, 2025 Checklist: PO Master Validation Checklist Project Type: Greenfield with UI Final Score: 100% (after remediation) Decision: APPROVED
| Category | Status | Score |
|---|---|---|
| 1. Project Setup & Initialization | ✅ PASS | 100% |
| 2. Infrastructure & Deployment | ✅ PASS | 100% |
| 3. External Dependencies | ✅ PASS | 92% |
| 4. UI/UX Considerations | ✅ PASS | 100% |
| 5. User/Agent Responsibility | ✅ PASS | 100% |
| 6. Feature Sequencing | ✅ PASS | 100% |
| 7. Risk Management | SKIPPED | N/A (Greenfield) |
| 8. MVP Scope Alignment | ✅ PASS | 100% |
| 9. Documentation & Handoff | ✅ PASS | 89% |
| 10. Post-MVP Considerations | ✅ PASS | 100% |
| Issue | Resolution |
|---|---|
| No CI/CD Pipeline | Added Story 1.13: CI/CD Pipeline Setup |
| No Testing Infrastructure | Added Story 1.14: Testing Infrastructure Setup |
| No Application Monitoring | Added Story 6.7: Health Monitoring & Logging |
The PRD is comprehensive, well-sequenced, and covers MVP scope thoroughly. The Agile UI-First approach is properly implemented with all 19 screens scaffolded in Epic 1. All critical deficiencies have been addressed through the addition of 3 new stories.
Review the TechieBlog 2.0 PRD (docs/prd.md) and create detailed UI/UX specifications. Focus on the 19 core screens identified in Section 3.3, creating wireframes or detailed component specifications. Pay special attention to the Markdown editor experience, responsive layouts, and Fluent UI component selection. Ensure WCAG AA accessibility compliance throughout.
Review the TechieBlog 2.0 PRD (docs/prd.md) and create the technical architecture document. Define the 5-project structure in detail, database schema for PostgreSQL, service layer interfaces, and Fluent UI component architecture. Address the migration path from the existing MySQL/Blazorise/.NET 9 codebase. Document CSS variable theming implementation and configurable storage provider pattern.
Generated by Sarah (Product Owner) — BMAD Framework PRD Creation Date: December 16, 2025