Skip to main content

Overview

This guide will walk you through launching the application, logging in for the first time, and exploring the main interface of Tattoo Studio Manager.
Before proceeding, ensure you have installed the application and completed the initial setup wizard.

Launching the Application

1

Activate Virtual Environment

First, activate your Python virtual environment:
cd C:\path\to\TattoStudio
.venv\Scripts\activate.bat
On Windows, you can use the included batch file:
start.bat
@echo off
cd /d "%~dp0"
call .venv\Scripts\activate.bat
python main.py
pause
Simply double-click start.bat in the project folder.
2

Run the Application

Launch the application:
python main.py
The application loads in this order:
  1. Initializes the theme (light/dark mode from settings)
  2. Verifies database connection
  3. Opens the login dialog
  4. Loads the main window after successful authentication

First Login

When the application starts, you’ll see the InkLink OS login screen.
Login Screen

Default Test Accounts

If you seeded the database with sample data, you can use these test accounts:

Administrator

Username: admin
Password: admin123
Full system access

Assistant

Username: assistant
Password: assistant123
Studio operations access

Artist

Username: jesus
Password: tattoo123
Artist-specific access

Authentication Process

The login system uses secure bcrypt password hashing:
services/auth.py
def authenticate(db: Session, username: str, password: str) -> Optional[Dict]:
    """Authenticates user and returns profile if credentials are valid."""
    u = get_user_by_username(db, username)
    if not u or not u.is_active:
        return None
    if not verify_password(password, u.password_hash):
        return None

    # Update last login timestamp
    u.last_login = datetime.utcnow()
    db.commit()

    return {
        "id": u.id,
        "username": u.username,
        "role": u.role,
        "artist_id": u.artist_id,
    }
If you don’t have any users in the database, the First Run Wizard will automatically appear to guide you through creating an admin account.

Understanding the Main Interface

After logging in, you’ll see the main window with three main areas:

1. Top Navigation Bar

The top bar contains:
  • Studio Logo & Name (left): Your configured branding
  • Navigation Pills (center): Main sections of the app
  • User Button (right): Access to settings and logout
ui/main_window.py
self.btn_studio  = self._pill("Estudio")    # Studio dashboard
self.btn_sched   = self._pill("Agenda")     # Appointment scheduler  
self.btn_clients = self._pill("Clientes")   # Client management
self.btn_staff   = self._pill("Staff")      # Staff management
self.btn_reports = self._pill("Reportes")   # Reports & analytics
self.btn_forms   = self._pill("Inventario") # Inventory (admin only)

2. Main Content Area

The center area displays the current page:
The Studio page is your home screen with quick actions:
  • Create new appointment
  • Add new client
  • Open cash register
  • View portfolios
  • Studio statistics overview
ui/main_window.py
self.studio_page = StudioPage(
    studio_name=self.studio_name,
    logo_path=self._studio_logo_override,
)

3. Status Bar

The bottom status bar displays:
  • Application version
  • Last backup timestamp
  • System notifications
ui/main_window.py
self.statusBar().showMessage(f"Ver. 1.0.1 | Último respaldo {last}")

Role-Based Access Control (RBAC)

The application implements role-based access to protect sensitive features:
Full System AccessAdministrators can:
  • Access all pages and features
  • Manage inventory
  • Create and modify staff accounts
  • Configure system settings
  • Create/restore backups
  • View all reports
ui/main_window.py
if role == "admin":
    allowed |= {
        self.idx_clientes, self.idx_cliente_det,
        self.idx_staff, self.idx_staff_det,
        self.idx_inventory, self.idx_inv_items,
        # ... all indices
    }
If a user attempts to access a restricted page, they’re automatically redirected to the Studio dashboard with a status message.

User Panel

Click your username in the top-right corner to open the user panel:

Theme Toggle

Switch between light and dark mode

Settings

Configure studio info, schedule hours, and backups

About

View application version and information

Logout

Sign out and return to login screen

Common Tasks

  1. Navigate to Clientes (Clients)
  2. Click the + Nuevo Cliente button
  3. Fill in client information:
    • Name (required)
    • Phone and email
    • Instagram handle
    • Preferred artist
  4. Click Guardar (Save)
ui/pages/new_client.py
# Client dialog opens as a modal popup
dlg = NewClientDialog(self)
dlg.exec_()
  1. Navigate to Agenda (Schedule)
  2. Select a date and time slot
  3. Click to create a new session
  4. Fill in appointment details:
    • Client (search or create new)
    • Artist
    • Start and end time
    • Price
    • Notes
  5. Click Guardar (Save)
The session is created with status “Activa” (Active).
  1. Click Caja (Cash Register) from the Studio dashboard
  2. Select a completed session
  3. Enter payment details:
    • Amount
    • Payment method (Cash, Card, Transfer)
    • Date
  4. Confirm transaction
data/models/transaction.py
session_id    # Linked tattoo session
artist_id     # Artist who performed work
amount        # Payment amount
method        # Payment method
date          # Transaction date
  1. Click your username (top-right)
  2. Click Cerrar sesión (Logout)
  3. The login screen appears
  4. Enter different credentials
The application maintains session state and applies role-based restrictions automatically.
  1. Click your username (top-right)
  2. Toggle the Modo oscuro (Dark mode) switch
Theme preference is saved to settings.json and persists across sessions:
main.py
def load_theme_preference() -> str:
    if SETTINGS.exists():
        try:
            return json.loads(SETTINGS.read_text()).get("theme", "light")
        except Exception:
            pass
    return "light"

Keyboard Shortcuts

Login Screen

  • Enter: Submit login form
  • Esc: Close application

Main Window

  • Alt + Q: Quick search clients
  • Ctrl + N: New appointment
  • Ctrl + ,: Open settings

Data Management

Automatic Backups

The application automatically creates database backups:
services/backups.py
def create_backup_if_needed():
    """Creates backup if more than 24 hours since last backup."""
    # Checks last backup time
    # Creates timestamped backup: backup_YYYYMMDD_HHMMSS.db
    # Stores in backups/ directory
Backups are stored in the backups/ folder with timestamps:
  • backup_20260304_091530.db
  • backup_20260303_184522.db
Backups are created automatically on application start if more than 24 hours have passed since the last backup.

Manual Backup

To create a manual backup:
  1. Click your username → Ajustes (Settings)
  2. Go to the Respaldos (Backups) tab
  3. Click Crear respaldo ahora (Create backup now)

Restore from Backup

  1. Open Settings → Backups tab
  2. Select a backup from the list
  3. Click Restaurar respaldo seleccionado (Restore selected backup)
  4. Confirm the restoration
  5. Restart the application to apply changes
Restoring a backup will replace your current database. The current database is automatically backed up before restoration, but you should always verify your backups are working properly.

Next Steps

Now that you’re familiar with the basics, explore more advanced features:

Client Onboarding

Learn how to register new clients with consent forms

Inventory Management

Set up products and track stock levels

Financial Reports

Generate insights from your studio data

Portfolio Management

Organize and showcase artist work

Troubleshooting

  • Verify credentials are correct (usernames are case-sensitive)
  • Check if account is marked as active
  • Try resetting password through database (if admin access available)
  • Check console for error messages
This is normal behavior based on your role:
  • Artists don’t see Inventory
  • Assistants have limited access
  • Only admins see all features
Contact your administrator to request role changes.
If you see “database is locked”:
  1. Close all instances of the application
  2. Wait 30 seconds
  3. Relaunch the application
SQLite allows only one write operation at a time.
If your theme preference doesn’t persist:
  1. Check file permissions on settings.json
  2. Verify the file isn’t read-only
  3. Check console for JSON parsing errors
Delete settings.json to reset to defaults (will clear all settings).

Getting Help

If you encounter issues:
  1. Check the application logs in the console
  2. Review the Installation Guide for setup issues
  3. Check the First-Time Setup Guide for configuration help
  4. Contact your system administrator

Build docs developers (and LLMs) love