Entity relationships
Tables
users
projects
Relationships:
hasMany(Issue), hasMany(SavedFilter).
issues
Relationships:
belongsTo(User, 'user_id') as creator, belongsTo(User, 'assignee_id') as assignee, belongsTo(Project), hasMany(Comment).
A database-level trigger enforces
end_date >= start_date whenever both are set — this constraint exists in the schema itself, not just in request validation, so it holds even for data written outside the app (seeders, Tinker, and so on).comments
notifications
notification_settings
Unique on (
user_id, type, channel). A missing row for a given type/channel combination means “use that channel’s default” (in-app defaults on, email defaults off) rather than being explicitly set — see Notifications.
sessions
Laravel’s standard database session-driver table, surfaced in the UI as the active sessions list.
activity_logs
project_id became nullable to support account-level activity — renaming your profile, changing your password, revoking a session, updating session lifetime, deleting your account, and changing notification settings all write an entry with project_id = null. See Activity log for the full picture.saved_filters
Enums
Defined underapp/Enums/:
UserRole—admin,memberIssueStatus—open,in_progress,closedIssueLabel—bug,feature,performance,design,ux,choreNotifications\NotificationType—issue_assigned,issue_mentioned,issue_commented,issue_status_changed,issue_priority_changed,issue_labels_changed,issue_dates_changed,issue_updated,project_invited— see Notifications for which of these are actually triggered todayNotifications\NotificationChannel—in_app(default enabled),email(default disabled)
Laravel’s own queue tables (
jobs, failed_jobs, job_batches) also exist, backing the database queue driver used to deliver email notifications. They’re framework-standard and not covered further here.