01 / Graduation project · Enterprise software

Collabrium

View repository

Many workflows. One connected workspace.

A multi-tenant enterprise platform connecting project delivery, people, learning, collaboration, reports, and AI-assisted workflows.

My role
Team Lead & Backend Developer
Timeline
Oct 2025 — Jun 2026
Context
Four-person graduation project
Collabrium tenant administration dashboard

Actual product screen from the Collabrium project archive.ENGINEERING CASE STUDY

The challenge

Modern teams often spread their work across disconnected tools. Collabrium brings project management, people, learning, community, reporting, and AI assistance into one enterprise workspace.

The challenge was to make those features behave as one system: a user’s tenant, role, project membership, and account state all affect what they can see and do.

290+HTTP API actions
across the platform
30Concrete API
controllers
13Functional areas
in the backend
A team project, with clear ownership.I served as Team Lead and Backend Developer in a four-person team with Abeer Ahmad, Hanan Issa, and Nada Asad, under Dr. Thaer Sammar’s supervision. These figures describe the shared platform’s scope.

My contribution

I led the team through requirements analysis, two-week Agile sprints, implementation, integration, testing, and delivery. On the backend, I translated requirements into domain rules, API contracts, and application use cases.

  • Developed the .NET 8 backend around Clean Architecture, CQRS/MediatR, EF Core, and SQL Server.
  • Worked on tenant isolation and layered authentication and authorization, including Identity, JWT, rotating refresh tokens, policies, and project access.
  • Implemented connected workflows spanning work items, sprints, reporting, real-time features, background processing, and AI assistance.
  • Contributed to React frontend implementation and API integration alongside the team.

The architecture

The solution separates the API, Application, Domain, and Infrastructure projects. The domain owns business rules; the application layer coordinates use cases through interfaces; infrastructure provides persistence and external integrations.

01 / PRESENTATIONAPIHTTP contracts & policies02 / USE CASESApplicationCommands, queries & ports03 / BUSINESS COREDomainRules, models & invariantsInfrastructureEF Core · SQL Server · Identity · External servicesimplements ports

Commands and queries take different paths. Commands use domain models, repositories, and a Unit of Work. Queries use purpose-specific read models and DTO projections. Domain models and persistence entities are separated through explicit mappers.

Why that separation mattersA work-item state change is a business operation with invariants and history. A report is a read operation with a purpose-built projection. Giving them separate paths keeps their responsibilities explicit.

Engineering decisions

These choices connect the platform’s domain, persistence, access rules, and user experience. Open a decision to explore its implementation and the responsibility it serves.

Identity & API boundaries

01Tenant membership establishes request context.Multi-tenancy · Request scoping

The middleware resolves the authenticated user and tenant, checks activation and membership, and sets the scoped tenant context. Ordinary tenant-aware HTTP requests use the resulting context; hub routes and explicitly exempt endpoints follow separate paths.

What this supportsA request for a different organization is rejected before ordinary tenant-scoped work continues.

Explore the implementation
02Project access has its own authorization requirement.Policies · Resource authorization

The project-access handler verifies that the requested project belongs to the user’s tenant, then applies role and project-membership rules. Knowing a project ID does not establish access.

What this supportsProject resources have an explicit authorization boundary in addition to authentication.

Explore the implementation
03Refresh tokens rotate through persisted state.Identity · Credential lifecycle

A successful token refresh revokes the stored token, records its replacement, and persists a new refresh token with an expiry. The service rejects an inactive token before the refresh path proceeds.

What this supportsRotation and revocation have a visible representation in persistence.

Explore the implementation
04Validation and error contracts have shared infrastructure.FluentValidation · Problem Details

The registered request validator, when present, runs in the MediatR pipeline. Global exception handling groups validation errors by field and maps other failures into Problem Details with a trace identifier. Exception type and stack traces are added only in development.

What this supportsClients receive structured error information while the API keeps exception handling out of individual controllers.

Explore the implementation

Domain rules & workflow integrity

05The work hierarchy is a domain rule.Domain modeling · Relationship invariants

The domain validates allowed Epic, User Story, Task, Bug, and Test Case relationships. It rejects invalid type pairings, self-relations, duplicate relations, and prohibited parent/child configurations.

What this supportsHierarchy rules remain part of the model as users connect work across boards and detail views.

Explore the implementation
06A release state reflects the work underneath it.Polymorphism · State transition gates

UserStory applies different gates for testing, release, and completion. Completion checks child tasks and bugs are done and child test cases have passed, then delegates the state change to the shared workflow behavior.

What this supportsA story’s completion reflects its child delivery and quality work.

Explore the implementation
07Completed sprint work keeps its historical context.Lifecycle modeling · Analytical integrity

CompleteSprint moves only incomplete items back to the backlog. Completed items stay linked to the sprint while its completion and history update share a transaction.

What this supportsMoving unfinished scope forward preserves the meaning of historical delivery reports.

Explore the implementation
08Partial updates preserve the user’s intent.API semantics · Explicit patch decisions

PatchHelpers distinguishes an omitted string from a request to clear it or set a new value. Work-item updates also validate sprint relationships and move a user story’s recognized children with it when appropriate.

What this supportsEditing one field can leave another unchanged, and moving related work can preserve the hierarchy’s sprint invariant.

Explore the implementation

Data access & change consistency

09A use case defines the database transaction.Unit of Work · Transaction boundaries

Multi-step writes run through ExecuteInTransactionAsync. It executes the operation, saves, and commits, or rolls back when an exception escapes. Work-item creation coordinates a generated project code, the item, and its creation history.

What this supportsRelated database changes have a clear commit boundary.

Explore the implementation
10Read models answer a particular screen or question.CQRS · EF Core projections

Read models combine tenant and project scoping with filtering, projections, and AsNoTracking where appropriate. The display-name lookup selects only a work item’s code and title rather than its full entity graph.

What this supportsEach read can express the shape and scope of the data its caller needs.

Explore the implementation
11History turns changed values into useful context.Change detection · Audit history

ProjectHistoryRecorder compares snapshots, skips unchanged values and ignored technical properties, and resolves values for display before creating history records. A responsible user and related work context accompany the change.

What this supportsA teammate can understand what changed without interpreting raw related-record identifiers.

Explore the implementation

Integration & runtime behavior

12Generated suggestions pass through application checks.AI integration · Parsing, repair & fallback

Work-item AI output goes through JSON extraction, typed deserialization, normalization, and usability checks. Invalid responses trigger repair prompts within a bounded attempt loop, with fallback suggestions afterward. Normal commands validate the final user-approved data.

What this supportsAI can assist the workflow while the application controls usable structure and persistence.

Explore the implementation
13Real-time updates follow their resource context.SignalR · Connection & group scope

Presence, comments, and notifications use separate hubs. The comment hub resolves tenant context and works with the selected project and work item when loading discussion and routing updates.

What this supportsLive collaboration stays connected to the work resource the user opened.

Explore the implementation
14Events separate the business change from its responses.MediatR events · Separation of concerns

Sprint completion publishes an application event with relevant context. Separate notification and email handlers own their response. Notification handling filters and deduplicates recipients before delivery.

What this supportsEach follow-up has a distinct responsibility. The current events are in-process MediatR notifications, without a durable broker guarantee.

Explore the implementation
15Scheduled reminders belong to a managed worker lifecycle.BackgroundService · DI scopes · Cancellation

Hosted workers use PeriodicTimer and cancellation tokens. Each reminder run creates a service scope, finds due events, targets attendees, and marks processed reminders. Scheduled announcement delivery has a corresponding worker.

What this supportsTime-based behavior runs independently of page visits, within the ASP.NET Core host.

Explore the implementation
16A report dataset supports several delivery formats.Reporting · Read models · PDF & AI adapters

Scoped report data feeds JSON views, ScottPlot charts, QuestPDF exports, and AI interpretations. The current enum defines ten analytical report types, with sprint-summary functionality exposed separately.

What this supportsThe same analytical context can serve the interface, a portable document, and an assisted explanation.

Explore the implementation

Rules applied in the running workflows

17A status change checks responsibility before transition.Authorization · Workflow preconditions

UpdateWorkItemStatus rejects unassigned or blocked items, permits managers or the current assignee, checks allowed transitions, and requires a passed result before completing a test case. It then applies domain validation and records the change in a transaction.

What this supportsThe status endpoint combines permission checks with business preconditions.

Explore the implementation
18Attachment uploads verify the resource and the actor.Resource ownership · Upload workflow

AddWorkItemAttachment resolves the project and work item within the tenant, rejects empty uploads, and permits a manager, current assignee, or creator before calling storage. Attachment metadata and creation history are then saved in a database transaction.

What this supportsUpload permission is checked before the external storage operation. The database transaction covers metadata and history, not the external upload.

Explore the implementation
19Attachment type selects a storage implementation.Factory pattern · Interface-based integration

AttachmentStorageFactory routes images and videos to their dedicated Cloudinary implementations, and documents or logs to file storage. The upload command asks the factory through IAttachmentStorageFactory.

What this supportsThe use case can select storage behavior through an interface while infrastructure owns the provider-specific implementation.

Explore the implementation
20The persistence model declares its access paths.EF Core · Indexes · Inheritance mapping

WorkItemConfiguration defines project-based composite indexes for sprint/creation time, type, status, assignee, priority, and creation time. It also declares a unique code index and a discriminator for concrete work-item entity types.

What this supportsThe database model expresses uniqueness, query access paths, and work-item specialization explicitly. These declarations do not claim a measured performance gain.

Explore the implementation
21Team membership goes through the domain model.Encapsulation · Repository mapping

TeamsRepository converts the persisted team to its domain model before adding or removing members. Team rejects additions to inactive or full teams and prevents removal of the current lead; the repository then updates member rows and maps the domain state back.

What this supportsThe repository applies the membership rules when synchronizing database entities.

Explore the implementation
22Estimation has an explicit vocabulary.Domain value constraints · Typed specialization

UserStory.Estimate accepts only 1, 2, 3, 5, 8, or 13 story points. Constructors and the work-item update path call this method rather than accepting an arbitrary estimate directly.

What this supportsCreation and editing share the same allowed estimation values.

Explore the implementation

Watch the workflows

Five original recordings cover the organization workspace, delivery workflows, reporting, the Learning Hub, and multi-tenant architecture.

Original recording / 01

Project & work-item delivery

Follow project planning, work items, and the delivery workflow.

Original recording / 02

Tenant, users & teams

Explore the organization workspace and the people and teams inside it.

Original recording / 03

Reports & analytics

See the reporting workflow and the analytical views of project work.

Original recording / 04

Learning Hub

Explore roadmaps, courses, assignments, and shared learning resources.

Original recording / 05

Multi-Tenant Architecture

A visual overview of Collabrium’s tenant structure and role hierarchy.

Use the player’s full-screen control to inspect the interface in detail. Recordings play on request.

The product in practice

All 202 application screenshots from the project archive, organized by module. Open a module, then select any screen to view it at full size.

AI11 screens
Dev Pro AIGenerated Report
generate Roadmap
generate Work Item
Recommendation
Resource AIGenerated
Skills Gap
Sub Topic AIGenerated
Teams Prod AIGenerated Report
Tenant Info AIGenerated Report
Topic AIGenerated
view Roadmaps View
Auth13 screens
complete Setup Contact Info
complete Setup General Info
confirm Email
Contact.Emailpng
Contact
email Confirm Seccess Message
employee First Login
first Login
forgot Password
login Page
Resend Confirm Email
Reset Password Page
Update Password
CommunityHub21 screens
Announcement Dashboard-Board View
Announcement Dashboard-Table View
Cancel Event Confirm Dialog
Change Event Banner
Create Announcement Dialog
Create Event Dialog
Create Post Dialog
Delete Announcement Confirm Dialog
Delete Event Confirm Dialog
Delete Post Confirm Dialog
Detailed Announcement Dialog
Detailed Event Drawer
Detailed Post Dialog
Edit Announcement
Edit Post Comment
Events
Feed Page
Filter Announcement
Filtered Announcement
Filter Posts
My Event-Going
LearningHub47 screens
Article Comments Section
Article Content
Articles Page
Articles Page Manage
Assign Course To Team Dialog
Assign Course To User Dialog
Assigned To Me Courses
Assignments Page
cancel Assignment Confirm Dialog
Change Article Cover
Completed Course
Courses Page
Create Article Page
Create Course Dialog
Create Node Dialog
Create Reference Node Dialog
Create Resource Dialog
Create Roadmap
Create Sub Topic Dialog
Delete Article
Delete Course Confirm Dialog
Delete Roadmap Confirm Dialog
Detailed Article Page
Detailed Article Page Dev
Detailed Article Page Dev2
Detailed Course Developer View
Detailed Course Manager View
Edit Article Comment
Edit Article Report
Edit Course Dialog
Edit Course Thumbnail
Edit Roadmap
Filtered Courses
In Progress Course
Manage Article Tags
Manage Course Tags Dialog
Manage Roadmap Tags Dialog
My Courses
remove Roadmap Element
Roadmap Builder Page
Roadmap Developer View
Roadmap Developer View Page
Roadmap Node Details Drawer-Developer
Roadmap Node Details Drawer
Roadmap View Page
Saved Courses
Submit Rating Course
ProjectManagement10 screens
Confirm Reassign
Create Project Dialog
Delete Project Confirm Dialog
Edit Project Dialog
Project History Dialog
Projects Dashboard-Card View
Projects Dashboard-Card View Dev
Projects Dashboard-Table View
Projects Dashboard-Table View Dev
Reassign Team
Reports12 screens
blocked
Bug
Deloper Prod
Developer Prod2
Project Health
Project Health2
Sprint Progress
Sprints Summery
Teams Prod1
Teams Prod2
Tenant Info Report
Velocity
SprintManagement11 screens
Cancel Sprint Confirm Dialog
Complete Sprint
Create Sprint
Delete Sprint Confirm Dialog
Edit Sprint
Filtered Sprints
Sprint Details Page
Sprint Epics
Sprint Orphans
Sprints Page
Start Sprint Dialog
SuperAdmin12 screens
Deactivate
forgot Password Page
main Dashboard
super Admin Add New Super
super Admin Add Tenant
super Admin Dashboard
Super Admin Workspace
Tenant Added
Tenant Details Drawer
Tenant Profile-users
Tenant Profile
tenants Table
TeamManagement10 screens
Activate Team
Add Team Member
Create Team Dialog
Deactivate Team
Edit Team Dialog
Filter Teams
Full Teams
Remove Team Member Confirm Dialog
Team Details Page- Projects
Team Details Page
Teams2 screens
Add Team
Add Team Members
TenantAdmin4 screens
Deactivate My Tenant Dialog
Edit Tenant Dialog
Tenant Admin Main Dashboard
Tenant Admin Workspace
User9 screens
contact Edit
Edit Profile1
Edit Profile2
Edit Profile3
Edit Profile4
Manage My Skills
profile
profile Image Change
View User Skills
UsersManagement6 screens
Add Tenant Employee
Change User Role
Filter Drawer
tenant Admin Add Employee
Tenant Users Dashboard
User Details Drawer
WorkItemManagement30 screens
Add Attachment
Add Code Link
Add Comment
Add Relation Dialog
Assigned To Me Filter
Assign To Me Work Item
Assign To Others Work Item
backlog Page
Board
Board Filters
Create Task
Create Work Item Dialog
Delete Attachment
Delete Relation
Delete Work Item Confirm Dialog
Edit Comment
Edit Delete Code Link
Edit Task
Edit User Story Dialog
Edit Work Item Dialog
Epic&Its Children
Product Owner Create Planning Work Item Dialog
QACreate Excution Work Item Dialog
Story Board
View Attachment
View Candidates
View Code Links
View Comments
View Relations
View Work Item Dialog
Workspace4 screens
Notifications
Notifications2
public Content
View Online Users

The project story

The project began with a problem we recognized: organizations connecting their work across separate tools. These original visuals introduce the team, that challenge, and the connected platform we delivered.

Four original project visuals. Open an image to read it at full size.

Thesis & presentation

The final thesis records the requirements and system design in 272 pages. The updated 53-slide graduation presentation demonstrates the platform and its workflows.

Final project thesis cover
272 pages / PDF

Final project thesis

Requirements, system design, domain models, and the implementation walkthrough.

Read the thesis9.1 MB
Graduation project presentation cover
53 slides / PowerPoint

Graduation project presentation

The updated graduation presentation, including platform workflows and product demonstrations.

Download the presentation196.3 MB

What I took forward

This project taught me to reason about features as parts of one domain. A sprint change can affect work-item relationships, reports, history, and notifications. Clear boundaries and explicit invariants make those connections easier to manage.

My next iteration would strengthen integration coverage for cross-tenant access and authorization, add request tracing, and profile the most expensive analytical queries.

Explore the work

Explore the public code and the team’s frontend showcase for the implementation and product walkthroughs.

The next good thing starts here

Let’s build
something that matters.

I’m open to junior .NET backend and software engineering opportunities. Have a role or a problem in mind? I’d love to hear about it.

Start a conversation
GitHubLinkedInCodeforcesBASED IN PALESTINE · OPEN TO REMOTE WORK