Skip to content

Database Layout

Auto-generated from SQLModel metadata on 2026-06-22.

This page documents the LibrisLog database schema. It is intended for developers who need to understand the data model, write queries, or extend the application.

Tables

user

A user account.

ColumnTypeConstraintsNotes
idINTEGERPKAuto-increment
firstnameVARCHARNOT NULL
lastnameVARCHARNOT NULL
emailVARCHARUNIQUE, NOT NULL
roleVARCHARNOT NULL, INDEXdefault user
hashed_passwordVARCHARNOT NULL
credentials_versionINTEGERNOT NULLdefault 0
created_atDATETIMEUTC
updated_atDATETIMEUTC

apikey

API key for programmatic access.

ColumnTypeConstraintsNotes
idINTEGERPKAuto-increment
user_idINTEGERFK → user.id, NOT NULL, INDEX
key_prefixVARCHARNOT NULL, INDEX
key_hashVARCHARUNIQUE, NOT NULL
key_encryptedVARCHAR
descriptionVARCHAR
created_atDATETIMEUTC
last_used_atDATETIMEUTC
revoked_atDATETIMEUTC

book

A book in the user's library.

ColumnTypeConstraintsNotes
idINTEGERPKAuto-increment
titleVARCHARNOT NULL, INDEX
subtitleVARCHAR
authorVARCHARNOT NULL, INDEXdefault ``
isbnVARCHAR
cover_urlVARCHAR
publisherVARCHAR
published_yearINTEGER
page_countINTEGERNOT NULLdefault 0
languageVARCHAR(2)
notesVARCHAR
blurbVARCHAR
ratingINTEGER≥ 1; ≤ 5
reading_statusVARCHARNOT NULL, INDEXdefault want_to_read
user_idINTEGERFK → user.id, INDEX
date_addedDATETIMEINDEXUTC
date_startedDATETIMEINDEXUTC
date_finishedDATETIMEINDEXUTC

Unique constraint: (user_id, isbn) — uq_book_user_id_isbn

embed_token

A scoped embed token for iframe/dashboard integrations.

ColumnTypeConstraintsNotes
idINTEGERPKAuto-increment
user_idINTEGERFK → user.id, NOT NULL, INDEX
nameVARCHAR(255)NOT NULL
token_prefixVARCHARNOT NULL, INDEX
token_hashVARCHARUNIQUE, NOT NULL
scopesVARCHARNOT NULLdefault embed:stats:read
allowed_originsVARCHAR
expires_atDATETIMEUTC
last_used_atDATETIMEUTC
created_atDATETIMEUTC
revoked_atDATETIMEUTC

import_mapping

A saved column-mapping configuration for data import.

ColumnTypeConstraintsNotes
idINTEGERPKAuto-increment
user_idINTEGERFK → user.id, NOT NULL, INDEX
nameVARCHAR(255)NOT NULL
schema_fingerprintVARCHAR(64)NOT NULL, INDEX
source_fields_jsonVARCHARNOT NULL
mapping_jsonVARCHARNOT NULL
created_atDATETIMEUTC
updated_atDATETIMEUTC

Unique constraint: (user_id, name) — uq_import_mapping_user_id_name

Links an OIDC identity to a local user account.

ColumnTypeConstraintsNotes
idINTEGERPKAuto-increment
user_idINTEGERFK → user.id, UNIQUE, NOT NULL
provider_idVARCHARNOT NULL, INDEX
oidc_subVARCHARUNIQUE, NOT NULL
oidc_emailVARCHAR
oidc_nameVARCHAR
linked_atDATETIMEUTC

tag

A user-specific tag that can be applied to books.

ColumnTypeConstraintsNotes
idINTEGERPKAuto-increment
user_idINTEGERFK → user.id, NOT NULL, INDEX
nameVARCHARNOT NULL, INDEX
created_atDATETIMEUTC

Unique constraint: (user_id, name) — uq_tag_user_id_name

usersettings

Per-user settings such as language, timezone, and theme.

ColumnTypeConstraintsNotes
idINTEGERPKAuto-increment
user_idINTEGERFK → user.id, UNIQUE, NOT NULL
languageVARCHAR(10)NOT NULLdefault en
timezoneVARCHAR(64)NOT NULLdefault UTC
themeVARCHAR(20)NOT NULLdefault light
custom_themeVARCHAR(30)

book_tag

Many-to-many association between books and tags.

ColumnTypeConstraintsNotes
book_idINTEGERPK, FK → book.id
tag_idINTEGERPK, FK → tag.id

reading_progress

A page-number reading progress entry for a book.

ColumnTypeConstraintsNotes
idINTEGERPKAuto-increment
book_idINTEGERFK → book.id, NOT NULL, INDEX
user_idINTEGERFK → user.id, NOT NULL, INDEX
pageINTEGERNOT NULL≥ 0
created_atDATETIMEUTC
updated_atDATETIMEUTC

Enums

ReadingStatus

ValueMeaning
want_to_readWant To Read
currently_readingCurrently Reading
readRead
did_not_finishDid Not Finish

UserRole

ValueMeaning
adminAdmin
userUser

Conventions

  • Timestamps are stored as UTC via the UtcDateTime type decorator. Values are stored as naive UTC in SQLite and returned as timezone-aware datetime objects by the application.
  • Soft deletesApiKey and EmbedToken use a revoked_at timestamp instead of DELETE. Revoked entries are excluded from all queries.
  • Foreign keys — all user-owned tables reference user.id via foreign key constraints. Cascading behavior is handled in application code (not at the database level).
  • Unique constraints — compound constraints like (user_id, isbn) on book and (user_id, name) on tag enforce per-user uniqueness without restricting other users.

Released under the MIT License.