Database
kasl uses SQLite as its local database for storing work sessions, tasks, and configuration data.
Overview
Section titled “Overview”The database provides:
- Local Storage: All data stored locally for privacy
- ACID Compliance: Reliable data integrity
- Migration System: Safe schema updates
- Cross-Platform: Works on all supported platforms
Database Location
Section titled “Database Location”Database files are stored in platform-specific locations:
- Windows:
%LOCALAPPDATA%\lacodda\kasl\kasl.db - macOS:
~/Library/Application Support/lacodda/kasl/kasl.db - Linux:
~/.local/share/lacodda/kasl/kasl.db
Schema Overview
Section titled “Schema Overview”Tables
Section titled “Tables”workdays
Section titled “workdays”Stores daily work session information:
CREATE TABLE workdays ( id INTEGER PRIMARY KEY, date TEXT UNIQUE NOT NULL, start TEXT NOT NULL, end TEXT);pauses
Section titled “pauses”Stores break periods during work sessions:
CREATE TABLE pauses ( id INTEGER PRIMARY KEY, start TEXT NOT NULL, end TEXT, duration INTEGER);Stores task information and metadata:
CREATE TABLE tasks ( id INTEGER PRIMARY KEY, task_id INTEGER DEFAULT 0, timestamp TEXT DEFAULT CURRENT_TIMESTAMP, name TEXT NOT NULL, comment TEXT, completeness INTEGER DEFAULT 100, excluded_from_search BOOLEAN DEFAULT FALSE);Stores task categorization tags:
CREATE TABLE tags ( id INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL, color TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP);task_tags
Section titled “task_tags”Links tasks to tags (many-to-many relationship):
CREATE TABLE task_tags ( task_id INTEGER NOT NULL, tag_id INTEGER NOT NULL, FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE, PRIMARY KEY (task_id, tag_id));task_templates
Section titled “task_templates”Stores reusable task templates:
CREATE TABLE task_templates ( id INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL, task_name TEXT NOT NULL, comment TEXT, completeness INTEGER DEFAULT 0, created_at TEXT DEFAULT CURRENT_TIMESTAMP);migrations
Section titled “migrations”Tracks database schema version:
CREATE TABLE migrations ( version INTEGER PRIMARY KEY, name TEXT NOT NULL, applied_at TEXT DEFAULT CURRENT_TIMESTAMP);Data Types
Section titled “Data Types”Timestamps
Section titled “Timestamps”- Format: ISO 8601 (
YYYY-MM-DD HH:MM:SS) - Timezone: Local system time
- Storage: TEXT for human readability
- Format: ISO 8601 (
YYYY-MM-DD) - Storage: TEXT for consistency
Durations
Section titled “Durations”- Unit: Seconds
- Storage: INTEGER for efficient calculations
Booleans
Section titled “Booleans”- Storage: INTEGER (0 = false, 1 = true)
- SQLite standard: No native boolean type
Migration System
Section titled “Migration System”Automatic Migrations
Section titled “Automatic Migrations”Migrations run automatically on startup:
kasl watch # Migrations run automaticallyManual Migration Management
Section titled “Manual Migration Management”Debug builds provide migration commands:
# Check migration statuskasl migrations status
# View migration historykasl migrations historyMigration Process
Section titled “Migration Process”- Version Check: Compare current vs. target version
- Migration Selection: Find pending migrations
- Transaction: Apply migrations in transaction
- Version Update: Update migration table
- Rollback: Rollback on failure
Migration Safety
Section titled “Migration Safety”- Transactions: All migrations run in transactions
- Idempotency: Safe to run multiple times
- Rollback: Automatic rollback on failure
- Versioning: Strict version ordering
Data Management
Section titled “Data Management”Backup
Section titled “Backup”Create database backups:
# Copy database filecp ~/.local/share/lacodda/kasl/kasl.db kasl_backup.db
# Export datakasl export all --format json --output backup.jsonRestore
Section titled “Restore”Restore from backup:
# Replace database filecp kasl_backup.db ~/.local/share/lacodda/kasl/kasl.db
# Import data# (Manual import not yet implemented)Cleanup
Section titled “Cleanup”Remove old data:
# Remove specific taskskasl task remove 1 2 3
# Remove all today's taskskasl task remove --today
# Delete old pauses (manual SQL)sqlite3 kasl.db "DELETE FROM pauses WHERE start < date('now', '-30 days');"Performance
Section titled “Performance”Indexes
Section titled “Indexes”Automatic indexes for performance:
-- Workdays tableCREATE INDEX idx_workdays_date ON workdays(date);
-- Tasks tableCREATE INDEX idx_tasks_timestamp ON tasks(timestamp);CREATE INDEX idx_tasks_completeness ON tasks(completeness);
-- Pauses tableCREATE INDEX idx_pauses_start ON pauses(start);Optimization
Section titled “Optimization”- Connection Pooling: Efficient connection management
- Prepared Statements: Reused query plans
- Transactions: Batch operations for performance
- Memory Management: Automatic cleanup
Monitoring
Section titled “Monitoring”Check database performance:
# Enable SQLite loggingRUST_LOG=kasl=debug kasl report
# Check database sizels -lh ~/.local/share/lacodda/kasl/kasl.db
# Analyze databasesqlite3 kasl.db "ANALYZE;"Security
Section titled “Security”File Permissions
Section titled “File Permissions”Secure database file:
# Linux/macOSchmod 600 ~/.local/share/lacodda/kasl/kasl.dbchmod 700 ~/.local/share/lacodda/kasl/Data Privacy
Section titled “Data Privacy”- Local Storage: No data sent to external servers
- Encryption: Consider filesystem encryption
- Access Control: Restrict file permissions
- Audit Trail: Complete operation logging
Troubleshooting
Section titled “Troubleshooting”Common Issues
Section titled “Common Issues”Problem: Database locked
# Check for running processesps aux | grep kasl
# Stop all kasl processeskasl watch --stop
# Check file permissionsls -la ~/.local/share/lacodda/kasl/kasl.dbProblem: Corrupted database
# Check database integritysqlite3 kasl.db "PRAGMA integrity_check;"
# Recover if possiblesqlite3 kasl.db ".recover" | sqlite3 kasl_recovered.db
# Restore from backupcp kasl_backup.db kasl.dbProblem: Migration failures
# Check migration statuskasl migrations status
# View error logsRUST_LOG=kasl=debug kasl watch --foregroundDebug Database
Section titled “Debug Database”Enable SQLite debugging:
# Show SQL queriesRUST_LOG=kasl=debug kasl report
# Direct database accesssqlite3 ~/.local/share/lacodda/kasl/kasl.db
# Common queriesSELECT * FROM workdays ORDER BY date DESC LIMIT 5;SELECT * FROM tasks WHERE date(timestamp) = date('now');SELECT COUNT(*) FROM pauses WHERE date(start) = date('now');Advanced Usage
Section titled “Advanced Usage”Direct SQL Access
Section titled “Direct SQL Access”Access database directly:
sqlite3 ~/.local/share/lacodda/kasl/kasl.dbCommon queries:
-- Today's work sessionSELECT * FROM workdays WHERE date = date('now');
-- Today's tasksSELECT * FROM tasks WHERE date(timestamp) = date('now');
-- Today's pausesSELECT * FROM pauses WHERE date(start) = date('now');
-- Task completion statisticsSELECT COUNT(*) as total_tasks, SUM(CASE WHEN completeness = 100 THEN 1 ELSE 0 END) as completed, AVG(completeness) as avg_completionFROM tasksWHERE date(timestamp) = date('now');Data Export
Section titled “Data Export”Export specific data:
# Export workdayssqlite3 kasl.db "SELECT * FROM workdays;" > workdays.csv
# Export tasks with tagssqlite3 kasl.db "SELECT t.name, t.completeness, GROUP_CONCAT(tag.name) as tagsFROM tasks tLEFT JOIN task_tags tt ON t.id = tt.task_idLEFT JOIN tags tag ON tt.tag_id = tag.idGROUP BY t.idORDER BY t.timestamp DESC;" > tasks_with_tags.csvCustom Queries
Section titled “Custom Queries”Create custom reports:
-- Weekly summarySELECT date, COUNT(*) as tasks, AVG(completeness) as avg_completionFROM tasksWHERE date(timestamp) >= date('now', '-7 days')GROUP BY dateORDER BY date;
-- Tag usage statisticsSELECT tag.name, COUNT(*) as usage_countFROM tags tagJOIN task_tags tt ON tag.id = tt.tag_idGROUP BY tag.idORDER BY usage_count DESC;