🎉 Initial commit: Trackeep - Complete Productivity Platform

🚀 Features Implemented:
 Full-stack application with SolidJS frontend + Go backend
 User authentication with JWT tokens
 Bookmark management with tags and search
 Task management with status and priority tracking
 File upload and management system
 Notes with rich text editing and organization
 Advanced search and filtering across all content types
 Export/import functionality for data portability

🏗️ Architecture:
- Frontend: SolidJS + TypeScript + UnoCSS + TanStack Query
- Backend: Go + Gin + GORM + PostgreSQL/SQLite
- Deployment: Docker + Docker Compose + CI/CD pipeline
- Monitoring: Structured logging + metrics collection + health checks

📦 Production Ready:
 Multi-stage Docker builds for frontend and backend
 Production docker-compose with Redis and backup services
 GitHub Actions CI/CD pipeline with security scanning
 Comprehensive logging and monitoring system
 Automated backup and recovery strategies
 Complete API documentation and user guide

📚 Documentation:
- Complete API documentation with examples
- Comprehensive user guide with troubleshooting
- Deployment and configuration instructions
- Security best practices and performance optimization

🎯 Project Status: 100% COMPLETE (69/69 tasks)
Trackeep is now a production-ready, self-hosted productivity platform!
This commit is contained in:
Tomas Dvorak
2026-01-26 12:36:49 +01:00
commit 18aa702174
79 changed files with 12885 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
package models
import (
"time"
"gorm.io/gorm"
)
// Bookmark represents a saved bookmark/link
type Bookmark struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
UserID uint `json:"user_id" gorm:"not null;index"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
Title string `json:"title" gorm:"not null"`
URL string `json:"url" gorm:"not null"`
Description string `json:"description"`
// Organization
Tags []Tag `json:"tags,omitempty" gorm:"many2many:bookmark_tags;"`
// Metadata
Favicon string `json:"favicon"`
Screenshot string `json:"screenshot"`
IsRead bool `json:"is_read" gorm:"default:false"`
IsFavorite bool `json:"is_favorite" gorm:"default:false"`
// Content extraction
Content string `json:"content"`
Author string `json:"author"`
PublishedAt *time.Time `json:"published_at"`
// Reading tracking
ReadAt *time.Time `json:"read_at"`
}
+51
View File
@@ -0,0 +1,51 @@
package models
import (
"time"
"gorm.io/gorm"
)
// FileType represents the type of file
type FileType string
const (
FileTypeDocument FileType = "document"
FileTypeImage FileType = "image"
FileTypeVideo FileType = "video"
FileTypeAudio FileType = "audio"
FileTypeArchive FileType = "archive"
FileTypeOther FileType = "other"
)
// File represents a stored file
type File struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
UserID uint `json:"user_id" gorm:"not null;index"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
OriginalName string `json:"original_name" gorm:"not null"`
FileName string `json:"file_name" gorm:"not null;uniqueIndex"`
FilePath string `json:"file_path" gorm:"not null"`
FileSize int64 `json:"file_size" gorm:"not null"`
MimeType string `json:"mime_type" gorm:"not null"`
FileType FileType `json:"file_type" gorm:"not null"`
// Organization
Tags []Tag `json:"tags,omitempty" gorm:"many2many:file_tags;"`
// Metadata
Description string `json:"description"`
IsPublic bool `json:"is_public" gorm:"default:false"`
// Preview/Thumbnail
ThumbnailPath string `json:"thumbnail_path"`
PreviewPath string `json:"preview_path"`
// Content extraction (for documents)
Content string `json:"content"`
}
+29
View File
@@ -0,0 +1,29 @@
package models
import (
"github.com/trackeep/backend/config"
"gorm.io/gorm"
)
// DB is the global database instance
var DB *gorm.DB
// InitDB initializes the global database variable
func InitDB() {
DB = config.GetDB()
}
// AutoMigrate runs database migrations for all models
func AutoMigrate() {
db := config.GetDB()
// Auto migrate all models
db.AutoMigrate(
&User{},
&Tag{},
&Bookmark{},
&Task{},
&File{},
&Note{},
)
}
+37
View File
@@ -0,0 +1,37 @@
package models
import (
"time"
"gorm.io/gorm"
)
// Note represents a note or document
type Note struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
UserID uint `json:"user_id" gorm:"not null;index"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
Title string `json:"title" gorm:"not null"`
Content string `json:"content" gorm:"type:text"`
// Organization
Tags []Tag `json:"tags,omitempty" gorm:"many2many:note_tags;"`
// Metadata
Description string `json:"description"`
IsPublic bool `json:"is_public" gorm:"default:false"`
IsPinned bool `json:"is_pinned" gorm:"default:false"`
// Formatting
ContentType string `json:"content_type" gorm:"default:markdown"` // markdown, html, plain
// Relationships
ParentNoteID *uint `json:"parent_note_id,omitempty"`
ParentNote *Note `json:"parent_note,omitempty" gorm:"foreignKey:ParentNoteID"`
Subnotes []Note `json:"subnotes,omitempty" gorm:"foreignKey:ParentNoteID"`
}
+31
View File
@@ -0,0 +1,31 @@
package models
import (
"time"
"gorm.io/gorm"
)
// Tag represents a tag for organizing content
type Tag struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
UserID uint `json:"user_id" gorm:"not null;index"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
Name string `json:"name" gorm:"not null;uniqueIndex"`
Description string `json:"description"`
Color string `json:"color" gorm:"default:#39b9ff"` // Go-inspired blue
// Usage tracking
UsageCount int `json:"usage_count" gorm:"default:0"`
// Relationships
Bookmarks []Bookmark `json:"bookmarks,omitempty" gorm:"many2many:bookmark_tags;"`
Tasks []Task `json:"tasks,omitempty" gorm:"many2many:task_tags;"`
Files []File `json:"files,omitempty" gorm:"many2many:file_tags;"`
Notes []Note `json:"notes,omitempty" gorm:"many2many:note_tags;"`
}
+61
View File
@@ -0,0 +1,61 @@
package models
import (
"time"
"gorm.io/gorm"
)
// TaskStatus represents the status of a task
type TaskStatus string
const (
TaskStatusPending TaskStatus = "pending"
TaskStatusInProgress TaskStatus = "in_progress"
TaskStatusCompleted TaskStatus = "completed"
TaskStatusCancelled TaskStatus = "cancelled"
)
// TaskPriority represents the priority of a task
type TaskPriority string
const (
TaskPriorityLow TaskPriority = "low"
TaskPriorityMedium TaskPriority = "medium"
TaskPriorityHigh TaskPriority = "high"
TaskPriorityUrgent TaskPriority = "urgent"
)
// Task represents a task or todo item
type Task struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
UserID uint `json:"user_id" gorm:"not null;index"`
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
Title string `json:"title" gorm:"not null"`
Description string `json:"description"`
Status TaskStatus `json:"status" gorm:"default:pending"`
Priority TaskPriority `json:"priority" gorm:"default:medium"`
// Organization
Tags []Tag `json:"tags,omitempty" gorm:"many2many:task_tags;"`
// Scheduling
DueDate *time.Time `json:"due_date"`
CompletedAt *time.Time `json:"completed_at"`
// Progress tracking
Progress int `json:"progress" gorm:"default:0"` // 0-100 percentage
// Relationships
ParentTaskID *uint `json:"parent_task_id,omitempty"`
ParentTask *Task `json:"parent_task,omitempty" gorm:"foreignKey:ParentTaskID"`
Subtasks []Task `json:"subtasks,omitempty" gorm:"foreignKey:ParentTaskID"`
// Dependencies
Dependencies []Task `json:"dependencies,omitempty" gorm:"many2many:task_dependencies;"`
}
+31
View File
@@ -0,0 +1,31 @@
package models
import (
"time"
"gorm.io/gorm"
)
// User represents a user in the system
type User struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
Email string `json:"email" gorm:"uniqueIndex;not null"`
Username string `json:"username" gorm:"uniqueIndex;not null"`
Password string `json:"-" gorm:"not null"` // Hashed password
FullName string `json:"full_name"`
// Preferences
Theme string `json:"theme" gorm:"default:dark"`
Language string `json:"language" gorm:"default:en"`
Timezone string `json:"timezone" gorm:"default:UTC"`
// Relationships
Bookmarks []Bookmark `json:"bookmarks,omitempty" gorm:"foreignKey:UserID"`
Tasks []Task `json:"tasks,omitempty" gorm:"foreignKey:UserID"`
Files []File `json:"files,omitempty" gorm:"foreignKey:UserID"`
Notes []Note `json:"notes,omitempty" gorm:"foreignKey:UserID"`
}