- Updated COMPLETE_DOCUMENTATION.md feature descriptions - Updated user journey reference from 'ebook library' to 'ebook collection' - Updated all frontend page titles and headers - Updated Bruno API collection and workspace names - All references now consistently use 'Bookmann' as the application name
25 KiB
Bookmann - Complete Documentation
Overview
Bookmann is a self-hosted ebook management system built with:
- Backend: Go API with Echo framework, PostgreSQL database with sqlc code generation, serving static frontend
- Frontend: Svelte with Vite, TypeScript, and TailwindCSS (built to static files)
- Database: PostgreSQL with migrations
- Deployment: Fully containerized with Docker and Docker Compose (single Go service)
Features
- Ebook management (CRUD operations)
- Reading progress tracking
- Responsive web interface
- RESTful API (accessible by web, mobile, etc.)
- Type-safe database queries with sqlc
- Modern UI with TailwindCSS
- Single-container deployment (Go serves everything)
Quick Start
Prerequisites
- Docker and Docker Compose
- Git (for cloning)
Running the Application
- Clone the repository:
git clone <repository-url>
cd bookmann
- Start all services:
docker-compose up --build
- Access the application:
- Application: http://localhost:8765 (serves both frontend and API)
- Database: localhost:5432 (postgres/password)
Project Structure
bookmann/
├── backend/
│ ├── cmd/server/
│ │ └── main.go # Application entry point
│ ├── internal/
│ │ ├── config/
│ │ │ └── config.go # Configuration management
│ │ ├── database/
│ │ │ ├── connection.go # Database connection (pgx pool)
│ │ │ └── queries/
│ │ │ └── queries.sql # SQL queries for sqlc
│ │ └── handlers/
│ │ └── ebook.go # HTTP handlers
│ ├── migrations/
│ │ └── 001_create_tables.up.sql # Database schema
│ ├── Dockerfile # Backend Docker image (builds frontend)
│ ├── go.mod # Go dependencies
│ ├── go.sum
│ └── sqlc.yaml # sqlc configuration
├── frontend/
│ ├── src/
│ │ ├── lib/
│ │ │ ├── api.ts # API client with auth & error handling
│ │ │ ├── auth.ts # Auth state management
│ │ │ └── toast.ts # Toast notification utilities
│ │ ├── routes/
│ │ │ ├── login/
│ │ │ │ └── +page.svelte # Login page (Tokyo Night theme)
│ │ │ ├── register/
│ │ │ │ └── +page.svelte # Registration page (Tokyo Night theme)
│ │ │ ├── +layout.svelte # Root layout with auth & toasts
│ │ │ └── +page.svelte # Library page (Tokyo Night theme)
│ │ ├── app.css # Global styles with Tokyo Night theme
│ │ ├── app.d.ts # TypeScript declarations
│ │ └── app.html # HTML template with Inter font
│ ├── package.json # Node dependencies with toast library
│ ├── svelte.config.js # SvelteKit config (adapter-static)
│ ├── tailwind.config.js # Tailwind config with Tokyo Night colors
│ ├── postcss.config.js # PostCSS configuration (Tailwind v4)
├── docker-compose.yml # Multi-service orchestration (db + backend only)
├── README.md # Basic README
└── .gitignore
Backend Documentation
Go Modules
Dependencies in go.mod:
- github.com/labstack/echo/v4 v4.11.3 - Web framework
- github.com/jackc/pgx/v5 v5.4.3 - PostgreSQL driver (pgx pool)
- github.com/golang-jwt/jwt/v5 v5.3.0 - JWT handling
- github.com/google/uuid v1.4.0 - UUID generation
- github.com/go-playground/validator/v10 v10.30.1 - Input validation
- golang.org/x/crypto v0.46.0 - Cryptographic functions (bcrypt)
Configuration
Environment variables (with defaults):
- SERVER_PORT=8765
- DATABASE_HOST=localhost
- DATABASE_PORT=5432
- DATABASE_USER=postgres
- DATABASE_PASSWORD=password
- DATABASE_NAME=ebookdb
- JWT_SECRET=your-secret-key
- UPLOAD_PATH=./uploads
Database Schema
Tables:
users
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) UNIQUE NOT NULL,
username VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
ebooks
CREATE TABLE ebooks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
title VARCHAR(255) NOT NULL,
author VARCHAR(255),
isbn VARCHAR(13),
description TEXT,
file_path VARCHAR(500) NOT NULL,
file_size BIGINT,
mime_type VARCHAR(100),
cover_image_path VARCHAR(500),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
reading_progress
CREATE TABLE reading_progress (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
ebook_id UUID NOT NULL REFERENCES ebooks(id) ON DELETE CASCADE,
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
current_page INTEGER DEFAULT 0,
total_pages INTEGER,
last_read_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(ebook_id, user_id)
);
reading_progress
CREATE TABLE reading_progress (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
ebook_id UUID NOT NULL REFERENCES ebooks(id) ON DELETE CASCADE,
user_id VARCHAR(100) NOT NULL,
current_page INTEGER DEFAULT 0,
total_pages INTEGER,
last_read_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(ebook_id, user_id)
);
Indexes:
- idx_users_email ON users(email)
- idx_users_username ON users(username)
- idx_ebooks_title ON ebooks(title)
- idx_ebooks_author ON ebooks(author)
- idx_reading_progress_ebook_id ON reading_progress(ebook_id)
- idx_reading_progress_user_id ON reading_progress(user_id)
Authentication
The application uses JWT (JSON Web Tokens) for authentication. The flow is:
- Register or Login via
/api/auth/registeror/api/auth/login - Receive JWT token in response
- Include token in
Authorization: Bearer <token>header for protected requests - Token expires after 24 hours
Security Features:
- Passwords hashed with bcrypt (cost factor 10)
- JWT signed with configurable secret key
- User data properly isolated per authenticated user
- Unique constraints on email and username
API Endpoints
All endpoints now include comprehensive server-side validation. Invalid requests return detailed error messages in the response body.
Auth (Public)
POST /api/auth/register
- Body: { email: string, username: string, password: string }
- Returns: { token: string, user: UserProfile }
POST /api/auth/login
- Body: { login: string, password: string } (login can be email or username)
- Returns: { token: string, user: UserProfile }
GET /api/auth/profile (requires JWT)
- Returns: UserProfile
Ebooks (requires JWT)
GET /api/ebooks
- Query params: limit (default: 20), offset (default: 0)
- Returns: Array of ebook objects
GET /api/ebooks/:id
- Path param: id (UUID)
- Returns: Single ebook object
POST /api/ebooks
- Body: Ebook data (JSON)
- Required fields: title, file_path
- Returns: Created ebook object
PUT /api/ebooks/:id
- Path param: id (UUID)
- Body: Updated ebook data (JSON)
- Returns: Updated ebook object
DELETE /api/ebooks/:id
- Path param: id (UUID)
- Returns: 204 No Content
Reading Progress (requires JWT)
GET /api/ebooks/:id/progress
- Path param: ebookId
- Returns: Reading progress object for authenticated user
PUT /api/ebooks/:id/progress
- Path param: ebookId
- Body: { current_page: number, total_pages?: number }
- Returns: Updated progress object for authenticated user
Type Definitions
Ebook
interface Ebook {
id: string;
title: string;
author: string | null;
isbn: string | null;
description: string | null;
file_path: string;
file_size: number | null;
mime_type: string | null;
cover_image_path: string | null;
created_at: string;
updated_at: string;
}
UserProfile
interface UserProfile {
id: string;
email: string;
username: string;
created_at?: string;
}
ReadingProgress
interface ReadingProgress {
ebook_id: string;
user_id: string;
current_page: number;
total_pages: number | null;
last_read_at: string;
}
Frontend Documentation
SvelteKit Setup
- Framework: SvelteKit with TypeScript
- Build tool: Vite
- Styling: TailwindCSS
- Authentication: JWT-based with localStorage token storage
- State Management: Svelte stores for reactive auth state
- Routing: Protected routes with auth-based conditional rendering
- UI Components: Custom components with Tailwind classes
Key Files
src/lib/api.ts
API client functions for all backend endpoints with JWT authentication and error handling:
- Auth functions: registerUser(), loginUser(), getUserProfile()
- Ebook functions: fetchEbooks(), fetchEbook(), createEbook(), updateEbook(), deleteEbook()
- Progress functions: fetchReadingProgress(), updateReadingProgress() (user-specific via token)
- Error handling: Automatic toast notifications for API errors with parsed error messages
- All functions automatically include Bearer token headers when authenticated
src/lib/auth.ts
Authentication state management store:
- Reactive auth state with Svelte stores
- JWT token persistence in localStorage
- Login/logout functionality
- Auth state initialization
src/lib/toast.ts
Toast notification utilities:
- showError() - Display error toasts with Tokyo Night red styling
- showSuccess() - Display success toasts with Tokyo Night green styling
- Integrated with API error handling for automatic user feedback
src/routes/login/+page.svelte
Login page with form validation and error handling
src/routes/register/+page.svelte
Registration page with password confirmation and validation
src/routes/+layout.svelte
Root layout with authentication:
- Auth state initialization and management
- Conditional rendering based on login status
- Navigation header with user info and logout
- Auth forms for unauthenticated users
Styling
Tokyo Night Theme with TailwindCSS:
- Color Palette: Custom Tokyo Night colors (#1a1b26 backgrounds, #7aa2f7 accents)
- Typography: Inter font family loaded from Google Fonts
- Animations: Custom fade-in and slide-in animations
- Components: Pre-built button, card, input, and navigation styles
- Dark Theme: Complete dark mode implementation with proper contrast
- Responsive Design: Mobile-first approach with breakpoint optimizations
- Interactive Elements: Hover effects, focus states, and smooth transitions
Authentication Flow
Frontend Implementation:
- State Management: Reactive auth store with login/logout actions
- Token Persistence: JWT tokens stored in localStorage with session persistence
- Route Protection: Layout component handles auth-based conditional rendering
- API Integration: All API calls include auth headers automatically
- Form Validation: Client-side validation with error display
- User Experience: Seamless transitions between auth states
Docker Configuration
Backend Dockerfile
- Multi-stage build with Go and Node.js stages
- Alpine Linux for small final image
- Frontend built to static files during Docker build
- sqlc code generation during build
- Binary compilation with CGO disabled
- Static files copied to final image
Docker Compose Services
db (PostgreSQL)
- Image: postgres:15-alpine
- Health check with pg_isready
- Volume for data persistence
- Init scripts from migrations folder
backend (Go API + Static Frontend)
- Build from backend/Dockerfile
- Environment variables for configuration
- Health check for application availability
- Depends on database health
- Volume for uploads directory
- Serves both API and static frontend files
Networking
Services communicate via Docker networks:
- backend serves static files for frontend and API endpoints
- backend connects to db:5432
- All services restart automatically on failure
Development Setup
Backend Development
cd backend
go mod tidy
go run github.com/sqlc-dev/sqlc/cmd/sqlc@latest generate
go run cmd/server/main.go
Frontend Development
For development, run the frontend separately:
cd frontend
npm install
npm run dev -- --open
Note: For production, frontend is built statically and served by the Go backend. API calls should proxy to the backend (e.g., via Vite proxy in dev).
Database Development
# Connect to database
psql -h localhost -p 5432 -U postgres -d ebookdb
# Run migrations manually (if needed)
# Migrations run automatically in Docker
Deployment
Production Considerations
- Environment Variables: Change default passwords, JWT secret, and database credentials
- Database: Use managed PostgreSQL in production with connection pooling
- File Storage: Implement cloud storage for ebook files (S3, etc.)
- Authentication: JWT secrets should be strong and rotated regularly
- HTTPS: Configure SSL certificates for secure transmission
- Rate Limiting: Add rate limiting for auth endpoints to prevent brute force
- User Management: Consider email verification, password reset, account locking
- Monitoring: Add logging and monitoring for auth failures
- Backup: Regular database backups including user data
Scaling
- Database can be moved to separate instance
- Backend can be scaled horizontally with load balancer
- Frontend static files can be served from CDN
- File storage can use cloud storage (S3, etc.)
User Journey
Complete User Flow
- Registration: User visits
/register, fills form, receives JWT token - Login: User can login with email or username, receives JWT token
- Token Storage: Frontend stores JWT in localStorage
- API Access: All subsequent API calls include Bearer token
- Library Access: User sees their ebook collection with personal reading progress
- Progress Tracking: Reading progress is automatically associated with user
- Session Management: User stays logged in across browser sessions
- Logout: User can logout, clearing token and redirecting to login
Security Features
- Password Hashing: Bcrypt with cost factor 10
- JWT Tokens: 24-hour expiration, signed with configurable secret
- User Isolation: All data is user-specific and properly segregated
- Session Persistence: Secure token storage with automatic validation
- API Protection: All sensitive operations require valid authentication
API Usage Examples
Registering a User
curl -X POST http://localhost:8765/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"username": "testuser",
"password": "securepassword"
}'
Logging in a User
curl -X POST http://localhost:8765/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"login": "user@example.com",
"password": "securepassword"
}'
Creating an Ebook (requires JWT token)
curl -X POST -H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
http://localhost:8765/api/ebooks \
-d '{
"title": "Sample Book",
"author": "Sample Author",
"file_path": "/uploads/sample.epub",
"file_size": 1024000,
"mime_type": "application/epub+zip"
}'
Getting Reading Progress (requires JWT token)
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
http://localhost:8765/api/ebooks/123e4567-e89b-12d3-a456-426614174000/progress
Updating Progress (requires JWT token)
curl -X PUT -H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
http://localhost:8765/api/ebooks/123e4567-e89b-12d3-a456-426614174000/progress \
-d '{"current_page": 45, "total_pages": 200}'
Register User
curl -X POST http://localhost:8765/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"username": "testuser",
"password": "securepassword"
}'
Login User
curl -X POST http://localhost:8765/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"login": "user@example.com",
"password": "securepassword"
}'
Getting Reading Progress (requires JWT token)
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
http://localhost:8765/api/ebooks/123e4567-e89b-12d3-a456-426614174000/progress
Updating Progress (requires JWT token)
curl -X PUT -H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
http://localhost:8765/api/ebooks/123e4567-e89b-12d3-a456-426614174000/progress \
-d '{"current_page": 45, "total_pages": 200}'
Recent Changes (Complete Multi-User Auth System)
As of the latest updates, the application has been completely transformed into a full multi-user ebook management system:
- Multi-User Authentication: Complete user system with registration/login, supporting both email and username login, JWT-based sessions, and bcrypt password hashing
- Security: Passwords stored with industry-standard bcrypt hashing, JWT tokens for API access, user data isolation, secure token management
- API Evolution: Auth endpoints added, reading progress now user-specific (removed :userId params), all ebook operations require authentication
- Frontend Auth Integration: Svelte frontend fully updated with login/register forms, JWT token management in localStorage, reactive auth state store, protected routes with automatic redirects
- User Experience: Seamless auth flow with form validation, session persistence, user dashboard, logout functionality
- Architecture: Single Go service serving both static frontend and API, no Node.js dependency
- Database: New users table, updated reading_progress with user foreign keys, comprehensive indexing
- Testing: Bruno collection updated with auth flows and Bearer token authentication
- Cleanup: Removed obsolete Docker files for frontend containerization
Latest Updates (Enhanced Validation, UI/UX & Tokyo Night Theme)
Backend API Validation Enhancement
- Server-Side Validation: Added comprehensive input validation using
github.com/go-playground/validator/v10 - Request Validation: All API endpoints now validate request data before processing
- Error Responses: Detailed validation error messages returned for invalid requests
- Security: Prevents malformed data from reaching the database layer
Validation Rules Added:
- User Registration: Email format validation, username length (3-50 chars), password minimum length (6+ chars)
- User Login: Required email/username and password fields
- Ebook Creation: Required title and file_path, minimum title length (1-500 chars), optional file size validation
- Ebook Updates: Title validation when provided, cover image path validation
- Reading Progress: Required current_page (≥0), optional total_pages (≥1)
Frontend Toast Notifications
- Error Notifications: Real-time toast popups for all API errors using
@zerodevx/svelte-toast - User Feedback: Immediate visual feedback for failed operations (login, registration, CRUD operations)
- Error Parsing: Automatically extracts and displays backend validation messages
- Non-Intrusive Design: Toasts appear without disrupting user workflow
Tokyo Night Theme Redesign
- Complete UI Overhaul: Transformed the entire frontend with the popular Tokyo Night dark theme
- Color Palette: Deep blue backgrounds (#1a1b26), cyan accents (#7dcfff), and carefully chosen contrast colors
- Modern Design: Gradient backgrounds, smooth animations, and professional card-based layouts
- Enhanced Typography: Inter font family for improved readability
- Interactive Elements: Hover effects, focus states, and smooth transitions throughout
Tokyo Night Color Scheme:
Background: #1a1b26 (dark blue-gray)
Secondary Background: #16161e (darker blue)
Highlights: #292e42 (medium blue-gray)
Foreground: #a9b1d6 (light blue-gray)
Accent Blue: #7aa2f7
Accent Cyan: #7dcfff
Accent Red: #f7768e
Accent Green: #9ece6a
Accent Purple: #bb9af7
Enhanced User Experience Features
- Loading States: Beautiful animated spinners during data fetching
- Form Validation: Real-time client-side validation with visual feedback
- Responsive Design: Optimized for all screen sizes with mobile-first approach
- Animation System: Fade-in and slide-in animations for page transitions
- Error Handling: Comprehensive error states with user-friendly messages
- Empty States: Attractive placeholders when no data is available
- Visual Hierarchy: Clear information architecture with proper spacing and typography
Technical Improvements
- Performance: Optimized CSS compilation with direct color values for better build performance
- Accessibility: Proper contrast ratios and focus management
- Code Organization: Clean separation of concerns with utility functions
- Type Safety: Full TypeScript integration with proper error typing
- Build Optimization: Efficient static file generation and caching
Updated Dependencies
- Backend: Added
github.com/go-playground/validator/v10for validation - Frontend: Added
@zerodevx/svelte-toastfor notifications - Fonts: Added Google Fonts Inter for enhanced typography
- Tailwind: Extended configuration with custom animations and Tokyo Night colors
User Interface Components
- Authentication Pages: Redesigned login/register forms with card layouts and icons
- Library View: Grid-based ebook display with hover effects and metadata
- Navigation: Clean header with user information and logout functionality
- Loading Screens: Beautiful animated loading states
- Error Displays: User-friendly error messages with appropriate styling
- Toast Notifications: Non-intrusive error feedback system
This comprehensive update transforms the application into a modern, professional ebook management system with excellent user experience, robust validation, and beautiful dark theme design.
Troubleshooting
Common Issues
-
Database Connection Failed
- Check if PostgreSQL container is running
- Verify DATABASE_* environment variables
- Check database logs:
docker-compose logs db
-
Application Not Accessible
- Verify backend container is running
- Check backend logs:
docker-compose logs backend - Test health endpoint:
curl http://localhost:8765/
-
Authentication Issues
- Verify JWT_SECRET environment variable is set
- Check token expiration (24 hours)
- Ensure Bearer token format:
Authorization: Bearer <token> - Test auth endpoints first:
/api/auth/register,/api/auth/login - Check validation errors in API responses (frontend shows toast notifications)
-
Validation Errors
- Frontend displays validation errors via toast notifications
- Check API response body for detailed error messages
- Ensure request data matches validation rules (email format, password length, etc.)
-
Frontend Not Loading
- Check backend logs for static file serving
- Verify frontend built correctly in Docker
- Check browser console for errors
- Ensure Tokyo Night theme CSS compiled properly
-
API Authorization Errors
- Confirm JWT token is valid and not expired
- Check middleware logs for auth failures
- Verify protected endpoints use correct HTTP methods
-
Build Failures
- Clear Docker cache:
docker system prune -a - Rebuild:
docker-compose up --build --force-recreate
- Clear Docker cache:
Logs
# All services
docker-compose logs
# Specific service
docker-compose logs backend
docker-compose logs frontend
docker-compose logs db
# Follow logs
docker-compose logs -f backend
Contributing
- Fork the repository
- Create a feature branch
- Make changes with proper testing
- Submit a pull request
License
MIT License - see LICENSE file for details
Future Enhancements
- Email verification for user registration
- Password reset functionality
- User profile management (update email/username, change password)
- Email notifications (welcome, password reset, etc.)
- User roles and permissions (admin, regular user)
- Ebook file upload and processing with validation
- EPUB/PDF reader component with bookmarking
- Advanced search and filtering (by author, genre, etc.)
- Categories and tags for ebooks
- Reading statistics and analytics dashboard
- Social features (sharing reading lists, reviews)
- Mobile app development (React Native/Flutter)
- Cloud storage integration (S3, Google Drive)
- Backup and restore functionality
- Admin panel for user management
- OAuth integration (Google, GitHub, Apple login)
- Two-factor authentication (2FA)
- Session management and device tracking
This documentation covers the complete setup, configuration, and usage of Bookmann. For specific implementation details, refer to the source code comments and type definitions.