No description
  • C# 75.1%
  • HTML 23.4%
  • JavaScript 0.8%
  • CSS 0.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
cheapnud 85ca830920
All checks were successful
Build & Test / Build and Test (push) Successful in 7m37s
Merge pull request 'package updates and self updating' (#7) from d/velopack-updates into master
2026-08-22 12:13:31 +00:00
.forgejo/workflows move forge workflows to the forgejo directory 2026-08-12 11:30:11 +02:00
.github/workflows Drop the GitHub PR review workflow 2026-08-20 23:06:14 +02:00
Auth let the auth provider dispose synchronously 2026-07-25 11:17:49 +02:00
Catalogue polish addresses export and materials edges with a default backstop index 2026-08-13 16:42:54 +02:00
CheapFurniturePlanner.Domain guard fabric resolution and cover subtotal rounding 2026-08-13 15:52:24 +02:00
CheapFurniturePlanner.Domain.Tests update packages 2026-08-22 13:45:07 +02:00
CheapFurniturePlanner.Tests add self updates with a restart chip 2026-08-22 13:53:33 +02:00
Components add self updates with a restart chip 2026-08-22 13:53:33 +02:00
Configurator scope price group resolution to the primary fabric option 2026-07-18 19:08:41 +02:00
Controllers use the configured login route in sign in feedback 2026-07-22 21:03:23 +02:00
Data log every material stock movement 2026-08-17 01:52:36 +02:00
Mappings carry placement configuration through view model and service 2026-07-06 21:16:11 +02:00
Migrations log every material stock movement 2026-08-17 01:52:36 +02:00
Models log every material stock movement 2026-08-17 01:52:36 +02:00
Properties Initial commit - CheapFurniturePlanner project 2025-08-11 20:35:48 +02:00
Repositories skip unbacked planner items in popular furniture 2026-07-26 01:33:37 +02:00
Seed publish only released models and republish on state change 2026-07-07 11:41:32 +02:00
Services fire reorder points without demand and guard supplier deletes 2026-08-17 03:38:17 +02:00
Ui polish the house style edges from review 2026-08-17 16:28:50 +02:00
ViewModels list catalogue elements in add flow and surface selection 2026-07-06 21:54:41 +02:00
wwwroot add the app theme with aliased fonts and flat chrome 2026-08-17 13:33:44 +02:00
.gitignore - Add .claude/ directory exclusion to .gitignore 2025-11-01 13:12:27 +01:00
app.manifest Initial commit - CheapFurniturePlanner project 2025-08-11 20:35:48 +02:00
App.razor add the app theme with aliased fonts and flat chrome 2026-08-17 13:33:44 +02:00
CheapFurniturePlanner.csproj update packages 2026-08-22 13:45:07 +02:00
CheapFurniturePlanner.sln add published catalogue store and configured placements 2026-07-06 15:26:50 +02:00
Program.cs add self updates with a restart chip 2026-08-22 13:53:33 +02:00
README.md update readme 2025-11-02 17:01:45 +01:00
Routes.razor gate pages and navigation by role 2026-07-22 19:35:50 +02:00
TODO.md tick the velopack wiring item 2026-08-22 14:05:20 +02:00

Cheap Furniture Planner

⚠️ Hobby Project Warning: This is a personal hobby project built for learning and experimentation. It may contain incomplete features, bugs, or undergo breaking changes without notice. Use at your own risk.

A desktop furniture room layout planning application built with Avalonia and Blazor. Design room layouts by placing furniture items on a virtual grid canvas with support for positioning, rotation, collision detection, and real-time visualization.

Features

  • Furniture Catalog: Browse, search, and manage furniture items with 20+ types (Sofa, Chair, Table, Bed, etc.)
  • Interactive Room Planning: Drag-and-drop furniture placement with collision detection and grid snapping
  • Canvas Controls: Rotate items (0-360°), multi-select (Shift/Ctrl), group furniture, customize grid settings
  • Modern UI: Material Design with MudBlazor, dark/light themes, responsive layouts
  • Data Management: SQLite database, usage statistics, auto-save, export/import room layouts

Technology Stack

  • C# 13 / .NET 10.0
  • Avalonia (desktop) + Blazor Server + MudBlazor 8.13.0 (UI)
  • SQLite with Entity Framework Core 9.0.10
  • Mapster 7.4.0 (object mapping)
  • CheapAvaloniaBlazor (1.1.3) - Custom hosting framework
  • CheapHelpers (1.1.2) - Utilities and EF extensions

Architecture

Clean architecture with layered separation:

  • Models (/Models): Domain entities (FurnitureItem, RoomPlan, PlannerFurnitureItem)
  • Data Access (/Data, /Repositories): EF Core context and repository pattern with IDbContextFactory
  • Services (/Services): Business logic (FurnitureCatalogService, RoomPlanService, PlannerService)
  • View Models (/ViewModels): DTOs for UI binding
  • Components (/Components): Blazor pages and shared components with MudBlazor

Installation

Prerequisites: .NET 10.0 SDK or later

git clone https://github.com/CheapNud/CheapFurniturePlanner.git
cd CheapFurniturePlanner
dotnet restore
dotnet run

Database is created automatically at %LocalAppData%\CheapFurniturePlanner\furniture_planner.db with sample data.

Usage

  1. Create Room Plan: Navigate to Room Plans → Create New Room Plan → Configure dimensions and grid settings
  2. Add Furniture: Go to Furniture Catalog → Add Furniture → Fill in dimensions and properties
  3. Design Layout: Open room plan → Add furniture from catalog → Drag, rotate, and position items on canvas
  4. Customize: Use grid snapping, collision detection, grouping, and custom notes for organization

Code Examples

Repository Pattern (Repositories/FurniturePlannerRepository.cs:87):

public async Task<List<FurnitureItem>> GetActiveFurnitureAsync(CancellationToken ct = default)
{
    using var context = _contextFactory.CreateDbContext();
    return await context.FurnitureItems
        .Where(f => f.IsActive)
        .OrderBy(f => f.Type)
        .ToListAsync(ct);
}

Service Injection (Program.cs):

builder.Services.AddScoped<FurnitureCatalogService>();
builder.Services.AddScoped<RoomPlanService>();
builder.Services.AddScoped<PlannerService>();

Database Schema

Three main tables:

  • FurnitureItem: Catalog with dimensions, properties, and metadata (unique Code index)
  • RoomPlan: Room layouts with configuration (Width, Height, Unit, GridSize, flags)
  • PlannerFurnitureItem: Furniture instances with position (X, Y), Rotation, GroupId, Notes

Relationships: RoomPlan → PlannerFurnitureItem (CASCADE), FurnitureItem → PlannerFurnitureItem (RESTRICT)

Development

Migrations: dotnet ef migrations add MigrationNamedotnet ef database update

Code Style: C# 13 features (primary constructors, collection expressions), async/await, LINQ lambda syntax, MudBlazor components

Testing: xUnit, BUnit (Blazor), Moq

Author

CheapNud - GitHub