Overview
The Artist Portfolio system provides a comprehensive image gallery for managing and showcasing tattoo work. Each artist builds their portfolio with high-quality images, detailed metadata, and automatic linking to clients and sessions for complete work tracking.Portfolio Structure
User-Based Organization
Portfolios are organized by user account:- Artists - Build their individual portfolios
- Admin/Assistants - Can upload to any artist’s portfolio
- Images linked to sessions - Automatically associated with clients and transactions
Sidebar Navigation
The sidebar displays all users with portfolio access: User Cards Show:- Profile avatar (44px circular image)
- Full name or username
- Role badge (Artist, Admin, Assistant)
- Active/Inactive status
- Image count
- Colored dot indicator (matches artist color)
- Colored top border (matches artist color)
Adding Images
Select Files
Choose one or more images from your computerSupported formats:
- PNG (.png)
- JPEG (.jpg, .jpeg)
- WebP (.webp)
- BMP (.bmp)
Link to Session (Optional)
For artists, you can link images to a recent session:
- System shows up to 30 recent sessions
- Format:
#ID · Date · Client Name - Select ”— No Link —” to skip
- Client
- Session details
- Transaction data
Image Metadata
Portfolio Item Fields
Each image includes rich metadata:Automatic Relationships
When linked to a session, the system automatically populates:- artist_id - From session artist
- client_id - From session client
- session_id - Direct session link
- Who did the tattoo (artist)
- Who received it (client)
- When it was done (session)
- How much they paid (transaction)
Gallery Views
Grid Layout
Responsive flow layout that adapts to screen size:- Cards arrange automatically in rows
- 220px wide cards with 260px height images
- 12px horizontal and vertical spacing
- Smooth hover effects
Portfolio Cards
Each card displays:- Image - Scaled to 260px height maintaining aspect ratio
- Date - Creation date in YYYY-MM-DD format
- Shadow effect - Subtle depth with 14px blur radius
- Hover state - Border highlights from rgba(255,255,255,0.08) to 0.18
Missing images show a gray placeholder with “no img” text instead of breaking the layout.
Filtering and Sorting
Available Filters
Toolbar filter dropdowns: Style Filter- Dynamically populated from uploaded images
- Shows only styles present in current portfolio
- “All Styles” to show everything
- Zones where tattoos are located
- Auto-populated from image metadata
- “All Zones” option
- All
- Color tattoos only
- Black & white only
- All
- Fresh tattoos (just completed)
- Healed tattoos (after healing period)
- Most Recent (default) - Newest first
- Oldest First - Chronological order
Filter Behavior
- Filters apply instantly without page reload
- Multiple filters combine with AND logic
- “Clear Filters” button resets all to defaults
- Filter values update when switching between artists
Filters only affect UI display - they don’t modify the database. This ensures fast, responsive filtering even with large portfolios.
Image Detail View
Click any image to open the detail dialog:Detail Dialog Contents
Left Side - Large Image- Full-size view (scaled to 640px width max)
- Maintains aspect ratio
- High-quality rendering with antialiasing
- Date: Upload date
- Artist: Artist name with link
- Session: Session ID, status, and price
- Client: Client name with link
- Transaction: Transaction ID, amount, and payment method
- Notes: Caption or description
- Frameless design with rounded corners
- Draggable - Click and drag to reposition
- Opens at cursor position
- Dark theme (#1f242b background)
- Close button to dismiss
Client Gallery Integration
In the Client Detail view:Client Portfolio Tab
Shows all images linked to that specific client:- Filtered by
client_id - Up to 200 images (configurable)
- Same card and detail view as main portfolio
- Sorted by most recent first
- Show client their previous work
- Reference old tattoos for new designs
- Track client’s collection over time
- Before/after comparisons
Storage and Organization
File System Layout
File Naming
- Original filenames preserved when possible
- Automatic incremental suffix for duplicates:
image_1.jpg,image_2.jpg - No overwrites - existing files never replaced
Legacy Migration
Automatic migration from old storage location:- Old:
assets/uploads/portfolios/ - New:
data/uploads/portfolios/ - Copies files on first access
- Preserves directory structure
Permissions
| Action | Admin | Assistant | Artist |
|---|---|---|---|
| View all portfolios | ✓ | ✓ | ✓ |
| Upload to own portfolio | ✓ | ✓ | ✓ |
| Upload to other portfolios | ✓ | ✓ | ✗ |
| Delete images | ✓ | ✓ | Own only |
| Edit metadata | ✓ | ✓ | Own only |
| View private images | ✓ | ✓ | Own only |
| Set cover image | ✓ | ✓ | Own only |
Best Practices
Image Quality Standards
Image Quality Standards
Recommended specifications:
- Minimum resolution: 1920×1080 pixels
- Maximum file size: 10 MB per image
- Format: JPEG for photos, PNG for graphics
- Color space: sRGB for consistent display
- Natural lighting or professional studio lights
- Neutral background (white or gray)
- Sharp focus on the tattoo
- Multiple angles for complex pieces
- Before/after shots for transformations
Metadata Tagging
Metadata Tagging
Why tag your images:
- Quick filtering for client consultations
- Portfolio curation by style
- Marketing material organization
- Track style evolution over time
- Upload images from session
- Immediately tag style and body area
- Mark color mode and fresh/healed status
- Add descriptive caption
- Link to session if not auto-linked
Portfolio Curation
Portfolio Curation
Building a strong portfolio:
- Quality over quantity - be selective
- Show variety of styles you’re confident in
- Include different body areas
- Mix fresh and healed shots
- Update regularly with latest work
- Mark best work as public
- Keep practice pieces private
- Hide client-requested private tattoos
Client Privacy
Client Privacy
Respect client consent:
- Always obtain image consent (tracked in client record)
- Mark non-consented images as private
- Blur faces if client requests
- Remove images if client revokes consent
- Don’t share identifying information in captions
Advanced Features
Cover Images
Set a cover image for each artist:- Shows first in galleries
- Used for artist profile displays
- Only one cover per artist
- Setting new cover unsets previous
Public/Private Toggle
Public images (is_public: true):
- Visible in public-facing galleries
- Shareable on social media
- Searchable by clients
is_public: false):
- Only visible to studio staff
- Hidden from public portfolio
- Still accessible via client records
- Useful for reference photos
Session Linking Benefits
Linking images to sessions provides:- Complete work history - See all photos from a session
- Financial tracking - Connect images to revenue
- Client journey - Visual timeline per client
- Artist analytics - Track productivity and style focus
- Portfolio stats - Revenue per image, popular styles
Related Features
- Client Management - Client gallery integration
- Appointment Scheduling - Link images to sessions
- Financial Tracking - Track image-to-revenue conversion
Technical Details
Database Schema
Image Processing
- No automatic resizing - Original images preserved
- Lazy loading - Images load as you scroll
- Thumbnail generation - Optional future enhancement
- Format conversion - None applied (preserve original)
Performance Optimization
- Batch loading - 60-200 images per load
- Offset pagination - For large portfolios
- In-memory filtering - Instant UI updates
- Lazy rendering - Cards created on-demand
Troubleshooting
Images Not Displaying
Images Not Displaying
Check:
- File path exists in database
- File actually exists on disk at
data/uploads/portfolios/{user_id}/ - File permissions allow read access
- Supported image format (PNG, JPEG, WebP, BMP)
- Image not corrupted (try opening in external viewer)
Upload Fails
Upload Fails
Possible causes:
- Disk space full
- No write permission to uploads folder
- Filename too long or contains special characters
- File already locked by another process
- Check available disk space
- Verify folder permissions
- Try renaming file to simple name
- Close other applications using the file
Session Link Not Working
Session Link Not Working
Requirements:
- User must have artist_id assigned
- Artist must have sessions in database
- Sessions must be within recent 30
- Session must have valid start date
- Verify user.artist_id is set correctly
- Check sessions table for that artist
- Ensure session.start is a valid datetime