Visual4Math uses SQLite to track user sessions, tool interactions, generated images, and evaluation responses for the user study.
The SQLite database (backend/visual4math.db) contains the following tables:
- user_sessions: User session tracking (start/end time, completion status)
- tool_a_generated_images: Images generated in Tool A (conversational interface)
- tool_b_layout_screenshots: Layout screenshots captured before image generation in Tool B
- tool_b_generated_images: Images generated in Tool B
- tool_c_canvas_states: Canvas states saved in Tool C
- tool_c_generated_images: Images saved in Tool C
- evaluation_responses: Evaluation answers (Likert scale 1-7) for each tool
- Study participants:
visual4mathuserstudy1throughvisual4mathuserstudy24 - Test users:
visual4mathtest1throughvisual4mathtest12
Authentication is handled via /api/tracking/auth endpoint.
- User ID
- Start time (when user enters ID)
- End time (when user completes study)
- Completion status
- Generated images with timestamps
- User text input that generated each image
- Operation type (addition, subtraction, multiplication, division)
- Final image selection per operation
- Layout screenshots (before image generation)
- Generated images with timestamps
- Operation type
- Final image selection per operation
- Canvas states (elements, text input)
- Saved images with timestamps
- Operation type
- Final image selection per operation
- Tool name (tool_a, tool_b, tool_c)
- Task/question ID
- Question text
- Likert scale answer (1-7)
- Timestamp
All tracking endpoints are under /api/tracking:
POST /api/tracking/auth- Authenticate user and create sessionPOST /api/tracking/session/end- End sessionPOST /api/tracking/tool-a/image- Submit Tool A generated imagePOST /api/tracking/tool-b/layout- Submit Tool B layout screenshotPOST /api/tracking/tool-b/image- Submit Tool B generated imagePOST /api/tracking/tool-c/canvas- Submit Tool C canvas statePOST /api/tracking/tool-c/image- Submit Tool C saved imagePOST /api/tracking/evaluation- Submit evaluation response
cd backend
sqlite3 visual4math.db
# View all sessions
SELECT * FROM user_sessions;
# View images generated in Tool A
SELECT user_id, image_url, operation, is_final, timestamp FROM tool_a_generated_images;
# View evaluation responses
SELECT tool, question, answer, timestamp FROM evaluation_responses WHERE user_id = 'visual4mathtest1';
.exitcd backend
sqlite3 visual4math.db -header -csv "SELECT * FROM user_sessions" > sessions.csv
sqlite3 visual4math.db -header -csv "SELECT * FROM tool_a_generated_images" > tool_a_images.csv
sqlite3 visual4math.db -header -csv "SELECT * FROM evaluation_responses" > evaluations.csvfrom app.database.db import SessionLocal
from app.models.tracking import UserSession, ToolAGeneratedImage, EvaluationResponse
db = SessionLocal()
session = db.query(UserSession).filter(UserSession.user_id == 'visual4mathtest1').first()
images = db.query(ToolAGeneratedImage).filter(ToolAGeneratedImage.user_id == 'visual4mathtest1').all()
db.close()The database is automatically initialized when the backend server starts. Tables are created automatically if they don't exist. No manual setup is required.
-- Get all sessions
SELECT * FROM user_sessions ORDER BY start_time DESC;
-- Count final images per tool
SELECT COUNT(*) FROM tool_a_generated_images WHERE is_final = 1;
SELECT COUNT(*) FROM tool_b_generated_images WHERE is_final = 1;
SELECT COUNT(*) FROM tool_c_generated_images WHERE is_final = 1;
-- Average evaluation ratings per tool
SELECT tool, question, AVG(answer) as avg_rating, COUNT(*) as responses
FROM evaluation_responses
GROUP BY tool, question;- All tracking calls are non-blocking (errors are logged but don't interrupt user flow)
- Session ID is stored in browser
sessionStorage - Images are stored as URLs (base64 data URIs for Tool C snapshots, server URLs for Tool A/B)
- Database file persists in
backend/visual4math.db
To backup the database:
cp backend/visual4math.db backend/visual4math_backup_$(date +%Y%m%d_%H%M%S).db